次用了hibernate做了一個簡單數據庫與前臺連接的小程序,能調用數據庫進行增刪該查。
這次我用struts 2 框架實現MVC模式的設計。
Struts 2 實現了MVC設計模式,其中,模型(Model)表示業務和數據庫代碼,視圖(View)頁面設計代碼,控制器(Controller)表示導航代碼。所有這些使struts 2成為java web應用的基本框架。
Struts 2主要包括控制器、Action對象、視圖jps頁面和配置文件等。如圖所示。
Struts 2 的MVC架構
控制器:控制器由核心過濾器StrutsPrepareAndExecuteFilter、若干攔截器和Action組件實 現
模型:模型由JavaBean或是JOPO實現,它可實現業務邏輯
視圖:通常由JSP頁面實現,也可以由Velocity Template、FreeMarke或其他表示層技術實 現
配置文件:Struts 2 框架提供一個名為struts.xml的配置文件,使用它來配置應用程序中組 件
Struts 2 標簽:Struts 2 提供了一個強大的標簽庫,該標簽庫提供了大量的標簽,使用這些 標簽可 以簡化JSP頁面的開發
這一步基本事可以省略的,因為大多數的環境若是支持Struts 2 的話應該會自帶它的標簽庫。
要使web程序支持struts 2 功能,需要在web.xml文件中聲明一個核心過濾器類和映射。
Struts 2 的每一個應用程序都有一個配置文件struts.xml,該文件用來指定動作類關聯的類、執行的方法以及執行的結果等。在開發環境下配置文件應該保存在src目錄中,Web應用打包后保存在WEB-INF\classes目錄中。
實戰簡單小程序
我用的環境是myeclipse10
創建一個向客戶發送一條信息的應用程序,完成下面三步:1.創建一個Action類執行某種操作;2.創建一個JSP頁面表示消息;3.在struts.xml文件中建立Action類與視圖的映射。
1 創建Action動作類
該頁面的動作是用戶單擊HTML頁面中的超鏈接向web服務器發送以惡搞請求。動作類execute()被執行并返回SUCCESS結果。Struts根據該結果返回一個視圖頁面。
HelloUserAction.java
package com.Model;
import com.opensymphony.xwork2.ActionSupport;
public class HelloUserAction extends ActionSupport {
private String message; //動作類的屬性
public String getMessage(){
return message;
}
public void setMessage(String message){
this.message=message;
}
public String execute() throws Exception{
setMessage("Hello Struts User");
return SUCCESS;
}
}
/*程序覆蓋了execute(),在其中調用set Message()設置message屬性值,然后返回字符串常量SUCCESS。該常量繼承了Action接口。*/
2 創建視圖頁面
用戶動作是通過index.jsp頁面的超鏈接觸發的。
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Basic Struts 2 Application - Welcome</title>
</head>
<body>
<h3>Welcome To Struts 2!</h3>
<p><a href="<s:url action='hello'/>">Hello User</p>
</body>
</html>
該頁面中使用了Struts 2 的標簽,要使用此標簽應該使用taglib指令導入標簽庫:
<%@ taglib prefix="s" uri="/struts-tags"%>
預覽效果
下面創建JSP頁面hellouser.jsp來顯示HelloUserAction動作類的message屬性值。
hellouser.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello User!</title>
</head>
<h2><s:property value="message"/></h2>
</html>
頁面中<s:property >標簽顯示HelloUserAction動作類的message的屬性值。通常在value屬性中的message告訴struts框架調用動作類的getMessage()。
3 修改struts。xml配置文件
struts.xml 文件用來配置請求動作、Action類和結果視圖之間的聯系。它通過映射來告訴Struts 2使用哪個Action類響應用戶的動作,執行哪個方法,根據方法返回字符串用哪個視圖。
編輯struts.xml文件,在<package>元素中添加<action>定義。
struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<constant name="struts.devMode" value="true" />
<package name="basicstruts2" extends="srtuts-defalut" namespace="/">
<action name="hello" class="com.Model.HelloUserAction" method="execute" >
<result name="success">/hellouser.jsp</result>
</action>
</package>
</struts>
struts.xml的可視化窗口
dan
單擊Hello User之后
以上的小程序只是簡單的介紹了Struts 2 的使用,沒有什么炫酷的效果,但要是結合我之前寫的hibernate做一個登錄注冊系統的話,只要能熟練的掌握,還是很方便快捷的比一般的編寫方法要更直觀更容易理解。
不喜歡打廣告,有緣下次再見!
1章 初識Struts2
本章學習目標
· 了解Struts2的起源和優缺點
· 熟練掌握Struts2的安裝和配置
· 理解Struts2的工作流程
· 熟練掌握Struts2的入門程序
在JavaWeb階段,相信讀者已經不知不覺中接觸了一些框架,例如JavaScript框架jQuery、單元測試框架Junit等,只是還沒有框架這個清晰的概念。
實際上,框架的使命就是Write less,do more!像Struts2這樣的大型框架實際上就是一組工具包的集合,通過配置或約定的方式實現以前需要編寫代碼才能夠完成的功能。從另一方面來看,框架也是某個特定領域中常用操作的提煉與封裝,無數程序員在大量的開發實踐中總結得出了很多解決特定問題的最佳方案,將這些解決方案集成到一起,在相同領域的不同項目工程中實現復用,這就是框架。
接下來將詳細介紹JavaEE三大框架中經典的MVC框架——Struts2。
1.1 Struts2概述
Struts2是開源組織Apache開發的一個MVC架構的框架,目的是為了代碼的可重用性和可維護性,從字面上看,Struts2好像是Struts1的升級版本,其實二者區別很大,Struts2是Struts1和WebWork結合的產物,既充分發揮了Struts1和WebWork兩種技術的優勢,又拋棄了Struts1的缺點,使Web開發更加容易。
1.1.1 Struts2的起源
2001年Struts1框架誕生,它是全世界第一個MVC框架,也曾一度是MVC領域最流行的框架。Struts1的成功得益于其豐富的文檔和活躍的社區。
隨著互聯網的飛速發展,Web應用也發展迅速,Struts1的缺點不斷暴露,大量開發者不得不開始尋找新的MVC框架,Strtus1的主要問題在于JSP、Servlet耦合非常緊密,導致了許多不可避免的問題,有以下幾個方面。
· Strtus1支持的表現層技術單一,僅支持JSP作為表現層技術,而目前很多JavaEE應用并不一定使用JSP作為表現層技術,這一點嚴重制約了Struts1框架的使用。
· Strtus1框架是在Model2的基礎上發展起來的,完全基于Servlet API,與Servlet API嚴重耦合,一點脫離Web服務器,Action的測試將變得非常困難
· Strtus1的Action類必須繼承其提供的Action基類,實現處理方法時,又必須使用大量Strtus1的專有API,這種侵入式設計的存在很大隱患,一單系統需要重構,這些Action類將無法復用。
由于存在以上無法避免的問題,從2008年底 Strtus1團隊放棄了對Strtus1的更新和維護。隨著JavaEE項目的不斷復雜化,很多軟件公司和開發人員開始選擇更好的MVC框架,如JSP、Tapestry、Spring MVC等,正是在這種背景下,誕生了Strtus2框架。
Strtus2框架誕生后,取代了原有的Strtus1和WebWork框架,原來使用Strtus1和WebWork的開發人員都轉入使用Strtus2框架,基于這種背景,Strtus2在短時間內迅速成為MVC領域最流行的框架。
1.1.2 Struts2的優缺點
Strtus2是由WebWork發展而來,具備了WebWork與生俱來的優勢,它的優點具體有以下幾個方面。
· 實現了MVC模式,結構清晰,使開發者只關注業務邏輯的實現。
· 支持更多的表現層技術,有更好的適應性。Strtus2對JSP、數據校驗等表現層技術都提供了很好的支持,開發者還可以根據自己的需要,自定義顯示的類型。
· Strtus2中的Action不需要與Servlet API耦合,測試變的更簡單,代碼的復用性更高。
· 具有良好的模塊化和可擴展性。Strtus2提供了更好的模塊化支持,更適合團隊協作開發的大項目。
· 提供了插件機制,開發者可以在不修改框架的前提下,通過開發插件來擴展Strtus2的功能,增強了框架的可擴展性。
· 提供了豐富的標簽,靈活運用這些標簽,可以大大提高開發效率。
當然,Strtus2也有其缺點,開發人員應當了解這些缺點,使用時揚長避短,它的缺點具體有以下幾個方面。
· 對事件支持不夠,在Strtus2中,實際是一個表單Form對應一個Action類,換句話說,就是在Strtus2中實際是一個表單只能對應一個事件,這種事件方式稱為application event,application event和component event相比是一種粗粒度的事件。
· 數據校驗過于細化,比較繁瑣,有些功能還不夠簡化,例如如果有多個字段,每個字段出錯時返回到不同的畫面,這個功能在借助Strut2框架提供的校驗邏輯就不容易實現。
· 存在兩個高危安全漏洞,一個是使用縮寫的導航參數前綴時的遠程代碼執行漏洞,另一個是使用縮寫的重定向參數前綴時的開放式重定向漏洞。這些漏洞可使黑客取得網站服務器的"最高權限",從而使企業服務器被控制。
1.2 Struts2下載和使用
在安裝Struts2之前,要確保已經成功安裝了JDK、Tomcat和Eclipse,如果未完成這些安裝,請安裝完畢后,再進行下面的步驟。
1.2.1 Struts2開發包下載
登陸http://struts.apache.org/,進入官網,如圖1.1所示。
圖1.1 Struts2官網
點擊Download,進入下載頁面,如圖1.2所示。
圖1.2 Struts2下載頁面
這里使用的是最新版本2.5.10.1,下載時有如下幾項。
· Full Distribution:下載Struts2的完整版,通常建議下載該選項,該選項包含Struts2的示例應用、空示例應用、核心庫、源代碼和文檔等。
· Example Applications:下載Struts2的示例應用,這些示例應用對于學習Struts2有很大的幫助,下載Struts2的完整版時包含該選項下的全部內容。
· Essential Dependencies Only:下載Struts2的核心庫,下載Struts2的完整版時包含該選項下的全部內容。
· All Dependencies:下載Struts2的所有依賴包,下載Struts2的完整版時包含該選項下的全部內容。
· Documentation:下載Struts2的相關文檔,包含Struts2的使用文檔、參考手冊和API文檔等,下載Struts2的完整版時包含該選項下的全部內容。
· Source:下載Struts2的全部源代碼,下載Struts2的完整版時包含該選項下的全部內容。
通常建議讀者下載Full Distribution和Documentation項,下載后的兩個壓縮包如圖1.3所示。
圖1.3 Struts2壓縮包
將下載得到的兩個*.zip文件解壓縮,解壓后兩個文件夾會覆蓋在一起,該文件夾包的目錄結構如圖1.4所示。
圖1.4 Struts2文件夾目錄結構
如圖1.4所示的目錄結構中有四個文件夾,存放的具體文件如下:
· apps:該文件夾下包含了基于Struts2的示例應用,這些示例應用對于學習者是非常有用的資料。
· docs:該文件夾下包含了Struts2的相關文檔,包含Struts2的快速入門、Struts2的文檔,以及API文檔等內容。
· lib:該文件夾下包含了Struts2框架的核心類庫以及第三方插件類庫。
· src:該文件夾下包含了Struts2框架的全部源代碼。
1.2.2 運行Struts2例子程序
下載并解壓完成Struts2的開發包后,里面包含了官方提供的例子程序,具體步驟如下。
(1)安裝配置好tomcat服務器,這里使用的是tomcat7.0.57,進入tomcat的bin目錄,如圖1.5所示。
圖1.5 tomcat的bin目錄
(2)雙擊startup.bat運行tomcat服務器,如圖1.6所示。
圖1.6 tomcat運行圖
(3)打開struts2開發包的apps目錄,如圖1.7所示。
圖1.7 struts2開發包apps目錄
(4)將struts2-rest-showcase.war復制到tomcat的webapps目錄,該war包會自動解壓并部署到服務器,如圖1.8所示。
圖1.8 struts2-rest-showcase.war自動部署
(5)此時打開瀏覽器,在地址欄輸入http://localhost:8080/struts2-rest-showcase運行例子程序,運行成功如圖1.9所示。
圖1.9 Struts2例子程序
如上運行的Struts2的官方例子程序有基本的增刪改查功能,這個例子程序能幫助開發者快速了解Struts2的用途,它用于處理程序中的視圖層,能夠快速、簡便地將數據呈現給用戶,在例子程序中點擊創建、查看或修改,會跳轉到相應的頁面進行處理,Struts2代碼的具體實現會在后面詳細講解。
1.2.3 在Eclipse中配置Struts2
直接利用tomcat服務器可以運行Struts2例子程序,但實際開發中大多在集成開發環境中來做,這里使用的是Eclipse,具體步驟如下。
(1)在Eclipse中新建Dynamic Web Project,也就是新建一個動態Web工程,如圖1.10所示。
圖1.10 動態Web工程
(2)在開發基于Struts2框架的Web應用時,不需要用到Struts2的全部功能,沒必要將Struts2壓縮包下lib目錄中的所有jar復制到工程中,這里只用其中的11個jar包即可完成大部分功能,將這些jar包復制到動態Web工程中的WEB-INF/lib路徑下,如圖1.11所示。
圖1.11 動態Web工程目錄
(4)打開Web應用的配置文件web.xml,在該配置文件中增加Struts2的核心控制器StrutsPrepareAndExecuteFilter的配置信息,如例1-1所示。
例1-1 web.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns="http://java.sun.com/xml/ns/javaee"
4 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
5 http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
6 id="WebApp_ID" version="3.0">
7 <display-name>struts2_01</display-name>
8 <welcome-file-list>
9 <welcome-file>index.html</welcome-file>
10 <welcome-file>index.htm</welcome-file>
11 <welcome-file>index.jsp</welcome-file>
12 <welcome-file>default.html</welcome-file>
13 <welcome-file>default.htm</welcome-file>
14 <welcome-file>default.jsp</welcome-file>
15 </welcome-file-list>
16 <!-- 配置Struts2核心Filter -->
17 <filter>
18 <!-- 過濾器名 -->
19 <filter-name>struts2</filter-name>
20 <!-- 核心Filter的實現類 -->
21 <filter-class>
22 org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
23 </filter-class>
24 </filter>
25 <!-- 配置核心Filter攔截所有請求 -->
26 <filter-mapping>
27 <!-- 過濾器名 -->
28 <filter-name>struts2</filter-name>
29 <!-- 匹配所有請求 -->
30 <url-pattern>/*</url-pattern>
31 </filter-mapping>
32 </web-app>
例1-1中,在web.xml中配置了Struts2的核心控制器StrutsPrepareAndExecuteFilter,該控制器攔截所有請求,Web應用此時已經具備了對Struts2框架基本功能的支持。
1.3 實現第一個Struts2程序
現在就自己來動手編寫一個Struts2程序,親自感受一下Struts2框架的基本使用。
下面將編寫第一個Struts2程序,其功能首頁有一個"添加員工"的按鈕,點擊按鈕,跳轉到添加員工的頁面,輸入員工姓名、員工年齡、員工性別,點擊"保存"按鈕,跳轉到員工信息的頁面,顯示剛添加完成的員工信息,此時點擊"回首頁"按鈕,會跳轉回首頁。
這里直接使用1.2.3小節中創建好的動態Web工程。
1.3.1 編寫前端頁面
根據上面添加員工的功能需求,這里需要3個JSP頁面,分別為index.jsp、saveUI.jsp和detail.jsp,其中index.jsp為首頁,saveUI.jsp為添加員工的頁面,detail.jsp為顯示員工信息的頁面。
在項目中的WebContent目錄下,新建index.jsp,接下來編寫該文件,如例1-2所示。
例1-2 index.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>Insert title here</title>
9 </head>
10 <body>
11 <center>
12 <h1>
13 <a href="${pageContext.request.contextPath }/saveUI.action">
14 添加員工
15 </a>
16 </h1>
17 </center>
18 </body>
19 </html>
例1-2中,在首頁寫入了一個"添加員工"的按鈕,該按鈕訪問saveUI.action,該請求會在struts.xml中進行映射。
在項目中的WebContent目錄下,新建saveUI.jsp,接下來編寫該文件,如例1-3所示。
例1-3 saveUI.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>Insert title here</title>
9 <style type="text/css">
10 .centerText {
11 text-align: center;
12 }
13 .textStyle {
14 border: 1px solid black;
15 }
16 .btnStyle {
17 border: 1px solid black;
18 width: 150px;
19 }
20 .btnStyle:hover {
21 border: 1px solid black;
22 width: 150px;
23 background-color: white;
24 }
25 .tableStyle {
26 border: 1px solid black;
27 border-collapse: collapse;
28 margin: 50px auto 0px auto;
29 }
30 .tableStyle td {
31 border: 1px solid black;
32 padding: 5px;
33 }
34 </style>
35 </head>
36 <body>
37 <form action="${pageContext.request.contextPath }/saveEmp.action"
38 method="post">
39 <table class="tableStyle">
40 <tr>
41 <td colspan="2" class="centerText" id="tableHeader">
42 保存員工信息
43 </td>
44 </tr>
45 <tr>
46 <td>員工姓名:</td>
47 <td>
48 <input class="textStyle" type="text" name="empName" />
49 </td>
50 </tr>
51 <tr>
52 <td>員工年齡:</td>
53 <td>
54 <input class="textStyle" type="text" name="empAge" />
55 </td>
56 </tr>
57 <tr>
58 <td>員工性別:</td>
59 <td>
60 <input class="textStyle" type="text" name="empSex" />
61 </td>
62 </tr>
63 <tr>
64 <td colspan="2" class="centerText"><input class="btnStyle"
65 type="submit" value="保存" /></td>
66 </tr>
67 </table>
68 </form>
69 </body>
70 </html>
例1-3中,在saveUI.jsp頁面有一個form表單,表單中可以填寫員工姓名、員工年齡和員工性別,最下面有一個保存按鈕,點擊按鈕將提交請求到saveEmp.action,該請求會在struts.xml中進行映射。
在項目中的WebContent目錄下,新建detail.jsp,接下來編寫該文件,如例1-4所示。
例1-4 detail.jsp
1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
4 "http://www.w3.org/TR/html4/loose.dtd">
5 <html>
6 <head>
7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
8 <title>Insert title here</title>
9 <style type="text/css">
10 .centerText {
11 text-align: center;
12 }
13 .textStyle {
14 border: 1px solid black;
15 }
16 .btnStyle {
17 border: 1px solid black;
18 width: 150px;
19 }
20 .btnStyle:hover {
21 border: 1px solid black;
22 width: 150px;
23 background-color: white;
24 }
25 .tableStyle {
26 border: 1px solid black;
27 border-collapse: collapse;
28 margin: 50px auto 0px auto;
29 }
30 .tableStyle td {
31 border: 1px solid black;
32 padding: 5px;
33 }
34 </style>
35 </head>
36 <body>
37 <table class="tableStyle">
38 <tr>
39 <td colspan="2" class="centerText" id="tableHeader">
40 顯示員工信息
41 </td>
42 </tr>
43 <tr>
44 <td>員工姓名:</td>
45 <td>${empName }</td>
46 </tr>
47 <tr>
48 <td>員工年齡:</td>
49 <td>${empAge }</td>
50 </tr>
51 <tr>
52 <td>員工性別:</td>
53 <td>${empSex }</td>
54 </tr>
55 <tr>
56 <td colspan="2" class="centerText">
57 <a
58 href="${pageContext.request.contextPath }/index.jsp">
59 回首頁
60 </a>
61 </td>
62 </tr>
63 </table>
64 </body>
65 </html>
例1-3中,在saveUI.jsp頁面有一個form表單,表單中可以填寫員工姓名、員工年齡和員工性別,最下面有一個保存按鈕,點擊按鈕將提交請求到saveEmp.action,該請求會在struts.xml中進行映射。
1.3.2 編寫控制器文件
如果說web.xml是這個Web應用的命脈,那么struts.xml就是Struts2的命脈,它用來處理請求映射,前端接收到客戶的請求,在這個文件中,可以映射到具體的實現類去處理請求,在項目的src目錄下,新建struts.xml,接下來編寫該文件,如例1-5所示。
例1-5 struts.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE struts PUBLIC
3 "-//Apache Software Foundation//DTD Struts
4 Configuration 2.5//EN"
5 "http://struts.apache.org/dtds/struts-2.5.dtd">
6 <struts>
7 <constant name="struts.enable.DynamicMethodInvocation"
8 value="false" />
9 <constant name="struts.devMode" value="true" />
10 <package name="default" namespace="/"
11 extends="struts-default">
12 <action name="saveUI"
13 class="com.opensymphony.xwork2.ActionSupport"
14 method="execute">
15 <result name="success">
16 /saveUI.jsp
17 </result>
18 </action>
19 <action name="saveEmp"
20 class="com.qianfeng.struts2.action.EmployeeAction"
21 method="saveEmp">
22 <result name="save-success">
23 /detail.jsp
24 </result>
25 </action>
26 </package>
27 </struts>
例1-5中,在<package>標簽中配置了兩個<action>標簽,第一個<action>將saveUI的請求映射到了com.opensymphony.xwork2.ActionSupport類的execute方法,當方法返回success字符串時,跳轉到項目根目錄下的saveUI.jsp頁面。第二個<action>將saveEmp的請求映射到了com.qianfeng.struts2.action.EmployeeAction類的saveEmp方法,當方法返回save-success字符串時,跳轉到detail.jsp頁面。
1.3.3 編寫Struts2處理程序
將前端頁面和控制器文件編寫完成后,這里開始編寫Struts2后臺處理的程序,具體處理前端發來的請求,這里編寫代碼的包名和類名,要與控制器文件中配置的第二個<action>相對應,在工程的src目錄下,新建com.qianfeng.struts2.action包,在包下新建EmployeeAction.java文件,如例1-6所示。
例1-6 EmployeeAction.java
1 public class EmployeeAction {
2 public EmployeeAction() {
3 }
4 private String empName;
5 private Integer empAge;
6 private String empSex;
7 public String saveEmp() {
8 return "save-success";
9 }
10 public String getEmpName() {
11 return empName;
12 }
13 public void setEmpName(String empName) {
14 this.empName=empName;
15 }
16 public Integer getEmpAge() {
17 return empAge;
18 }
19 public void setEmpAge(Integer empAge) {
20 this.empAge=empAge;
21 }
22 public String getEmpSex() {
23 return empSex;
24 }
25 public void setEmpSex(String empSex) {
26 this.empSex=empSex;
27 }
28 }
例1-6中,EmployeeAction類中定義了三個變量,分別對應前端頁面中員工姓名、員工年齡和員工性別的name屬性值,另外還提供了三個變量對應的get和set方法。saveEmp方法是處理saveEmp.action請求的方法,方法執行后,返回save-success字符串。
1.3.4 運行程序
程序編寫完成后,直接右鍵工程,選擇Run As,點擊Run on Server,如圖1.12所示。
圖1.12 右鍵工程
在彈出的Run on Server界面中,點擊Finish直接運行,如圖1.13所示。
圖1.13 Run on Server界面
在瀏覽器中訪問http://localhost:8080/struts2_01/index.jsp地址,會跳轉到主頁面,主頁面中只有一個按鈕,如圖1.14所示。
圖1.14 主頁面
點擊添加員工,會跳轉到添加員工的頁面,此時可以輸入要添加的員工信息,如圖1.15所示。
圖1.15 添加員工頁面
點擊保存,會跳轉到員工信息頁面,顯示剛添加的員工信息,如圖1.16所示。
圖1.16 員工信息頁面
點擊回首頁,會再次跳轉到首頁,這樣就完成了一個應用Struts2的Web程序。
1.4 Struts2架構和工作流程
Struts2是一個典型的MVC架構,其中M(邏輯層)用Java程序來實現,V(視圖層)用JSP來實現,C(控制層)用Action實現,Struts2本身不提供模型組件,但可以支持Spring、Hibernate等框架,與其他框架組合應用。
Struts2的框架結構與Struts1差別巨大,Struts2是以WebWork為核心,采用攔截器的機制對用戶的請求進行處理。Struts2的攔截器機制使得用戶的業務邏輯控制器與Servlet API完全分離,業務邏輯控制器更像一個POJO,它的架構如圖1.12所示。
圖1.17 Struts2架構圖
圖1.13中可以看到,Struts2處理一個用戶請求大致可以分為以下幾個步驟。
(1)用戶發出一個HTTP請求。
(2)這個請求經過一系列的過濾器來傳送,如果Struts2與其他插件或框架集成了,則請求先經過其他過濾器。
(3)StrutsPrepareAndExecuteFilter是Struts2的核心控制器,通過詢問Action映射器來確定該請求是否需要調用某個Action,如果需要調用某個Action,則StrutsPrepareAndExecuteFilter就將請求轉交給Action代理來處理。
(4)Action代理通過配置管理器訪問框架的配置文件struts.xml,從而找到需要調用的Action類。
(5)Action代理創建一個ActionInvocation的實例,該實例使用命名模式來調用。在Action執行的前后,ActionInvocation實例根據配置文件加載與Action相關的所有攔截器。
(6)一旦Action執行完畢,ActionInvocation實例根據struts.xml文件中的配置找到相應的返回結果,返回結果通常是一個JSP頁面或者FreeMarker的模板。
(7)最后HTTP響應通過web.xml文件中配置的過濾器返回。
1.5 本章小結
通過本章的學習,大家能夠對Struts2框架有初步的認識,重點要掌握的是Struts2開發環境的搭建,能編寫出一個基于Struts2的簡單程序,理解Struts2的架構和工作流程。
1.6 習題
1.填空題
(1) Struts2是開源組織 開發的一個框架。
(2) Strtus1的主要問題在于 、 耦合非常緊密。
(3) Strtus2實現了 模式,結構清晰,使開發者只關注業務邏輯的實現。
(4) Struts2壓縮包的 目錄下,存放的是Struts2官方提供的示例程序。
(5) 在動態Web工程中,配置Struts2需要在web.xml中配置Struts2的核心控制器 。
2.選擇題
(1) Struts2的核心控制器配置在( )文件中。
A.struts2.xmlB.struts2.properties
C.web.xmlD.struts2.java
(2) Struts2的所有jar包在( )目錄下。
A.appsB.docs
C.libD.src
(3) Struts2的核心控制器是( )。
A.StrutsPrepareAndExecuteFilterB.Servlet
C.ActionD.HttpServletRequest
(4) 下列不屬于傳統SSH三大框的是( )。
A.Struts2B.Spring MVC
C.HibernateD.Spring
(5) 如果配置Struts2攔截所有請求,應在<url-pattern>標簽中配置( )。
A./*B.*
C..D.?
3.思考題
(1) 請簡述Struts2與Struts1的區別。
(2) 請簡述Struts2的起源。
(3) 請簡述Struts2的優缺點。
(4) 請簡述Struts2開發環境的配置過程。
(5) 請簡述Struts2的工作流程。
4.編程題
編寫程序,完成如下功能:
(1)運行程序跳轉到首頁index.jsp,顯示如下按鈕:
(2)點擊去登陸,跳轉到login.jsp,顯示如下頁面:
(3)輸入正確的用戶名密碼,用戶名輸入"root",密碼輸入"admin",點擊登陸,會跳轉到success.jsp,顯示如下頁面:
(4)若輸入錯誤的用戶名和密碼,則跳轉到error.jsp,顯示如下頁面:
truts2中提供了一種很好的驗證瀏覽器端用戶輸入的數據是否合法的方式——框架驗證。通過框架驗證我們可以不用再寫JavaScript或者JQuery來驗證了,直接通過配置文件就可以很方便的做驗證而且配置起來比較方便。下面就通過代碼來看一下struts2的框架驗證實現步驟。
紅框中除了value=“”引號里面的內容外其他都是固定的,引號里面是你自定義的名字這里以messageResource為例,然后在struts.xml同一級目錄下創建messageResource_zh_CN.properties文件。
文件名字也是固定的,就是你前面定義的那個messageResource加上_zh_CN.properties
其中_zh_CN.properties代表的是中國,就是說如果程序運行環境在中國的話就從這個文件里面調用,如果是在美國就會從_en_US.properties后綴的文件里面調用。
其中messageResource_zh_CN.properties的默認格式不是utf-8,所以不支持中文,這個格式你也不用改,需要輸入中文直接輸入即可,程序運行時,會自動顯示中文,只是看起來是亂碼,當鼠標移動到某個定義的value值時會自動顯示你當時輸入的中文。如下圖:
如圖是驗證UserAction的輸入驗證,大家知道UserAction里的屬性和get、set方法是可以取得頁面上的值的,所有UserAction里的屬性值,即為跳轉到這個UserAction之前的jsp頁面你輸入的內容。而框架驗證的就是UserAction中的屬性內容。
這個文件命名是有規則的,即action的類名-validation.xml。這就是說這個UserAction-validation.xml就是驗證UserAction這個action里的屬性的驗證配置文件。
程序在運行過程中,在執行這個Action的某個方法之前會先執行Action屬性驗證,如果驗證沒有文件則進行到具體方法,否則的話是會返回到struts.xml配置中的input視圖對應的結果。
struts2的框架驗證就是通過了給Action加一個配置文件,然后在配置文件里面根據具體的業務需求來驗證Action中屬性內容是否合法,其中在驗證框架的配置文件中可以使用正則表達式等等,比較方便,而且驗證提示語都是來自properties文件,便于后期管理和維護,而且可以區分不同語言環境登錄下提示不同的內容,這個是其他驗證所不具備的功能。
后續內容持續更新,如果你也在學習技術,或者你想要成為全棧工程師,可以關注一下下哈。不定期更新java、框架、centos7等內容,讓你從代碼、框架、linux、人工智能做一個全面了解。O(∩_∩)O
*請認真填寫需求信息,我們會在24小時內與您取得聯系。