1.準備工做及實例

轉自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.htmlhtml

1.解壓struts-2.1.6-all.zipjava

apps目錄:struts2自帶的例子程序
docs目錄:官方文檔。web

lib 目錄:存放全部jar文件。apache

Src 目錄:源文件存放地瀏覽器

2.六個基本包緩存

struts2-core-2.1.6.jar 開發的核心類庫
freemarker-2.3.13.jar struts2的UI標籤的模板使用freemarker編寫
commons-logging-1.0.4.jar 日誌包
ognl-2.6.11.jar
對象圖導航語言,經過它來讀寫對象屬性
xwork-2.1.2.jar xwork類庫,struts2在其上進行構建
commons-fileupload-1.2.1.jar文件上傳組件,2.1.6版本後必須加入此jar包服務器

特別須要說明的是目前strust2的最新版本是struts-2.1.6,它做爲2.1.X的正式版。特別要注意導入commons-fileupload-1.2.1.jar包,在此jar包中包含了RequestContext類,若是不導入該jar包將會報異常。app

3.初識struts2配置文件框架

(1).web.xml文件 eclipse

主要完成對StrutsPrepareAndExecuteFilter的配置(在之前的版本中是對FilterDispatcher配置,新版本一樣支持用FilterDispatcher配置),它的實質是一個過濾器,它負責初始化整個Struts框架而且處理全部的請求。這個過濾器能夠包括一些初始化參數,有的參數指定了要加載哪些額外的xml配置文件,還有的會影響struts框架的行爲。除了StrutsPrepareAndExecuteFilter外,Struts還提供了一個ActionContexCleanUp類,它的主要任務是當有其它一些過濾器要訪問一個初始化好了的struts框架的時候,負責處理一些特殊的清除任務。

(2).struts.xml文件

框架的核心配置文件就是這個默認的struts.xml文件,在這個默認的配置文件裏面咱們能夠根據須要再包括其它一些配置文件。在一般的應用開發中,咱們可能想爲每一個不一樣的模塊單獨配置一個struts.xml文件,這樣也利於管理和維護。這也是咱們要配置的主要文件。

(3).struts.properties(參default.properties)

在Struts框架使用了不少屬性,咱們能夠經過改變這些屬性來知足咱們的需求。要改變這些屬性,只需在struts.properties文件中指定屬性的key和value便可。屬性文件能夠放在任何一個包含在classpath中的路徑上,可是一般咱們都把它放在/WEB-INF/classes目錄下面。咱們能夠在struts-default.properties文件中找到一個屬性的列表。

(4)struts-default.xml

此文件是struts2框架默認加載的配置文件,它定義了struts2一些核心bean和攔截器,它會自動包含(included)到struts.xml文件中(實質是經過<package  extends="struts-default">),併爲咱們提供了一些標準的配置。咱們能夠在struts2-core.jar中找到這個文件。

(5)其它配置文件

velocity.properties,struts-default.vm,struts-plugin.xml

4.讓MyEclipse提示xml信息

當咱們在編寫struts.xml時,發現eclipse並不會給出幫助提示,那是由於MyEclipse默認並不支持struts2,因此咱們須要手工導入dtd以支持提示。步驟:[window][preferences][MyEclipse][Files and Editors][XML][xml Catelog]而後在右邊點add添加:location爲dtd文件所在的位置(struts-2.0.dtd文件struts2-core-2.1.6.jar中能夠獲得),KeyType選擇URI,Key爲struts-2.0.dtd文件中文檔聲明的內容(http://struts.apache.org/dtds/struts-2.0.dtd),在struts.xml文件中也有此key值。

5.如何使用alt+/提示

在MyEclipse6.5中,默認的提示爲Ctrl+Space,而它會與咱們的輸入法切換衝突,使提示失效。找到key,先取消Content Assist命令的綁定,再用「alt+/」來綁定。

6.實例

步驟一,新建myStruts2項目,並導入struts2的六個基本jar包。
步驟二,創建LoginAction文件,主要代碼以下:

 1 package com.asm;
 2 
 3 import com.opensymphony.xwork2.Action;
 4 
 5 public class LoginAction implements Action{
 6 
 7     private String username;
 8     private String password;
 9     
10     public String getUsername() {
11         return username;
12     }
13 
14     public void setUsername(String username) {
15         this.username = username;
16     }
17 
18     public String getPassword() {
19         return password;
20     }
21 
22     public void setPassword(String password) {
23         this.password = password;
24     }
25 
26     @Override
27     public String execute() throws Exception {
28         if("struts2".equals(username)){
29             return "loginSuccess";
30         }else{
31             return "loginFailure";
32         }
33     }
34 
35     
36 }

 

說明:實現了Action接口,主要是爲了保證execute的正肯定義,其實咱們也能夠不實現此接口,只要能保證execute方法書寫的正確書寫(方法名,返回值)。

步驟三,在struts.xml文件中註冊LoginAction。此配置文件要放在src目錄下,實質就是成爲classpath環境變量下的文件。主要代碼以下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <!-- 指定WEB應用的編碼集,至關於調用HttpServletRequest.setCharacterEncodint方法,若是使用了velocity或freemarker,它也用於指定輸出的編碼格式 -->
 8     <constant name="struts.i18n.encoding" value="UTF-8"></constant>
 9     <!-- 指定請求後綴爲.action,指定多個請求後綴用逗號分隔 -->
10     <constant name="struts.action.extension" value="action,do"></constant>
11     <!--設置瀏覽器是否緩存靜態內容,建議:開發階段關閉,運行時開啓 -->
12     <constant name="struts.service.static.browerCache" value="false"></constant>
13     <!--當struts.xml配置文件修改後,系統是否從新加載該文件,開發階段打開此功能  -->
14     <constant name="struts.configuration.xml.reload" value="true"></constant>
15     <!--  開發提示:出錯時打印更詳細的信息-->
16     <constant name="struts.devMode" value="true"></constant>
17     
18     
19     <package name="myFirst" namespace="/" extends="struts-default">
20         <action name="login" class="com.asm.LoginAction">
21             <result name="loginSuccess">/success.jsp</result>
22             <result name="loginFailure">/failure.jsp</result>
23         </action>
24     </package>
25 </struts>

說明package後面會有詳細說明。action元素中的name屬性值指定了此action所指定的請求路徑爲「login.action」。後面login.jsp中的<form action=...>屬性值就會參照此name屬性。

步驟4、提供jsp頁面
login.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" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <form action="<%=request.getContextPath()%>/login.action" method="get">
11         用戶名:<input type="text" name="username"><br/>
12         密碼:<input type="password" name="password"><br/>
13         <input type="submit" value="login">
14     </form>
15 </body>
16 </html>

Failure.jsp主要代碼

1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib uri="/struts-tags" prefix="s" %>
3 <html>
4     <body>
5         登陸失敗,錯誤的用戶名:<s:property value="username"/><br>
6         <a href="<%=request.getContextPath()%>/login.jsp">返回</a>
7     </body>
8 </html>

說明:使用了標籤庫,在struts2中使用標籤庫很是簡單,只須要像上面那樣導入標籤庫即可以使用全部的struts2的全部標籤

success.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" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     登錄成功
11 </body>
12 </html>

步驟5、配置web.xml。完成核心監聽器註冊。內容以下:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
 3   <display-name>struts2demo</display-name>
 4   
 5   <filter>
 6       <filter-name>struts2</filter-name>
 7       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 8       
 9   </filter>
10   
11       <filter-mapping>
12         <filter-name>struts2</filter-name>
13         <url-pattern>/*</url-pattern>
14     </filter-mapping>
15   
16 </web-app>

 

 

說明:註釋掉的部分爲之前2.1.4版本中用的核心filter類。StrutsPrepareAndExecuteFilter類的init方法將會讀取類路徑下默認的配置文件struts.xml,並以javabean形式存放在內存中,之後struts2對用戶的每次請求將使用內存中數據,而不是重讀struts.xml文件。

步驟6、發佈測試。
簡要分析執行流程
當輸入login.jsp訪問jsp頁面填寫完相關信息並提交給login.action時,它會首先被在web.xml中配置的過濾器監聽到,過濾器會去查找strust.xml文件,並結合namespace查找名爲login的action,查找到此action便交給其處理,LoginAction內部會執行execute方法,並返回結果result(result也是參照的struts.xml中action下的result配置)。 關於表單傳參,主要是參照的action中的方法名,而非屬性名。

7.開啓struts2自帶的開發模式常量

在之前的開發中,當修改一些配置時老是不能及時地更新到服務器,咱們總會從新部署或重啓來更新改變的內容,在struts2中能夠經過一個常量來達到此目的。即在.struts.xml中的<struts>元素下增長以下內容:<constant name="struts.configuration.xml.reload" value="true" /> 這樣配置後,當配置文件修改保存時就會及時更新到服務器中。其它一些常量:

<!-- 指定WEB應用的編碼集,至關於調用HttpServletRequest.setCharacterEncodint方法,若是使用了velocity或freemarker,它也用於指定輸出的編碼格式 -->

       <constant name="struts.i18n.encoding" value="UTF-8" />

       <!-- 指定請求後綴爲.action,指定多個請求後綴用逗號分隔 -->

       <constant name="struts.action.extension" value="action" />

       <!--設置瀏覽器是否緩存靜態內容,建議:開發階段關閉,運行時開啓  -->

       <constant name="struts.serve.static.browserCache" value="false" />

       <!--當struts.xml配置文件修改後,系統是否從新加載該文件,開發階段打開此功能  -->

       <constant name="struts.configuration.xml.reload" value="true" />

       <!--  開發提示:出錯時打印更詳細的信息-->

       <constant name="struts.devMode" value="true" />

<!-- 指定請求的後綴能夠是.do或.action -->

       <constant name="struts.action.extension" value="do,action" />

注意:在struts2.1.6版本中存在一個bug:即配置了struts.i18n.encoding常量也不能解決中文亂碼問題,緣由是此版本在獲取請求參數後才調用了setCharacterEncoding()方法進行編碼設置。解決此bug的方法是配置一個filter,並在doFilter方法中增長以下代碼:request.setCharacterEncoding(「UTF-8」); 在之後的2.1.8版本中解決了此問題及2.1.6中存在的其它bug,建議新項目使用2.1.8版本。

相關文章
相關標籤/搜索