Struts2---入門
1、概念
Struts是一個流行和成熟的基於MVC模式下的Web應用程序框架,使用Struts的目的是爲了幫助我們減少在運用MVC設計模型來開發Web應用的時間MVC是模型(Model)、視圖(View)和控制器(Controller)的縮寫;MVC是一種軟件設計典範,用一種業務邏輯、數據、界面顯示分離的方法組織代碼,將業務邏輯聚集到一個部件裏面,在改進和個性化定製界面及用戶交互的同時,不需要重新編寫業務邏輯。在Struts中,Controller就是action。搭建Struts2環境步驟:
1、下載相關jar包;2、創建Web項目;3、創建並完善相關配置文件;4、創建Action並測試啓動;2、配置文件
解析struts.xml:
1、.dtd就是約束struts.xml中可以有哪些標籤不能有哪些標籤。2、<include><!-- 可以通過 <include file="">包含其他文件,include節點是struts2中組件化的方式,可以將每個功能模塊獨立到一個xml配置文件中,然後用Include節點引用 --><include file="struts-default.xml"></include>3、<package>package提供了將多個Action組織成爲一個模塊的方式。package的名字必須是唯一的(配置文件中可以有多個包,但包名要唯一),可以在這個包上加一些拓展的包。abstract設置package的屬性爲抽象,抽象的package不能定義action的值,ture或false。namespace="/test":http://localhost:8080/項目名/test/xx.actionnamespace="/":http://localhost:8080/項目名/xx.action<package name="包名" extends="繼承的父類的名稱" namespace="包的命名空間">4、攔截器<interceptors><!-- 攔截器定義name(名稱)和class(類路徑) --><interceptor name="" class=""></interceptor><!-- 定義攔截器棧 --><interceptor-stack name=""><interceptor-ref name=""></interceptor-ref></interceptor-stack></interceptors><!-- 定義默認的攔截器,每個Action都會自動引用。如果Action中引用了其他的攔截器,默認的攔截器將無效 --><default-interceptor-ref name=""></default-interceptor-ref>5、<global-results><!-- 全局results配置 --><global-results><result name="">/xxx.jsp</result></global-results>6、<action>
<!--
Action配置:一個Action可以被多次映射(只要action配置中的name不同)
name:action名稱,如(假設namespace="/"):http://localhost:8080/項目名/<action>中屬性name值.action
class:對應的類的路徑
method:調用Action中的方法名
Ps:每個package包裏可以定義多個action
-->
<action name="" class="" method="" converter="">
<!-- 引用攔截器:name:攔截器名稱或攔截器棧名稱 -->
<interceptor-ref name=""></interceptor-ref>
<!-- 節點配置:name:result名稱,和Action中返回的值相同(如果不寫name,默認SUCCESS或"success");
type:result類型,不寫則選用superpackage的type struts-default.xml中的默認爲dispatcher -->
<result name="" type="">/xxx.jsp</result>
<!-- 參數設置:name:對應Action中的get/set方法 -->
<param name="">值</param>
</action>
7、<constant>
<!-- struts.properties文件中的語句:struts.i18n.reload=true,則對應struts.xml文件中語法如下 -->
<constant name="struts.i18n.reload" value="true"></constant>3、深入
深入講解struts的八個主要步驟:
1.訪問Servlet API
2.Action搜索順序
3.動態方法調用
動態方法調用是爲了解決一個Action對應多個請求的處理,以免Action太多。
三種方式:指定method屬性、感嘆號方式、通配符方式
1:<action name="addAction" method="add" class="com.imooc.action.HelloWorldAction">
http://localhost:8080/HelloWorld/addAction.action
2:<constant name="struts.enable.DynamicMethodInvocation" value="false"> </constant>
<action name="helloworld" class="com.imooc.action.HelloWorldAction">
<result >/result.jsp</result>
<result name="add">/add.jsp</result>
<result name="update">/update.jsp</result>
</action>
http://localhost:8080/HelloWorld/helloworld!add.action
3: <action name="*_*" method="{2}" class="com.imooc.action.{1}Action">
<result >/{2}.jsp</result>
<result name="add">/{2}.jsp</result>
<result name="update">/{2}.jsp</result>
</action>
http://localhost:8080/HelloWorld/HelloWorld_add.action
4.指定多個配置文件
<include file="com/imooc/xml/helloworld.xml"></include>
5.默認Action
<default-action-ref name="error"></default-action-ref>
<action name="error">
<result>/error.jsp</result>
</action>
注意:<default-action-ref name="error">和<action name="error">必須要一致以及package——name不要一樣。
Ps:設置默認Action大前提:後綴正確範圍內有效以及不許有通配符出現。如“_”。
6.Struts2後綴
<!-- Struts2後綴方式一:struts.xml -->
<constant name="struts.action.extension" value="action,do"></constant>
<!-- Struts2後綴方式二:struts.properties -->
struts.action.extension=action,do,struts2
<!-- Struts2後綴方式三:web.xml -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>struts.action.extension</param-name>
<param-value>do</param-value>
</init-param>
</filter>
注意:如果值什麼都不寫,則後綴不加纔可以正常顯示。如果這條語法都沒有設置,則默認.action或什麼都不加後綴
7.接受參數
<!-- 使用Action的屬性接收參數 --> @login.jsp <form action="LoginAction.action" method="post"> 用戶名:<input name="user" type="text" /> 密碼:<input name="pwd" type="password" /> <input value="提交" type="submit" /> </form> @LoginAction.java public class LoginAction extends ActionSupport { private String user; private String pwd; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String login(){ System.out.println(user); System.out.println(pwd); return SUCCESS; } } @struts.xml <action name="LoginAction" class="com.imooc.action.LoginAction" method="login"> <result>/success.jsp</result> </action>
<!-- 使用DomainModel接收參數 --> @login.jsp <form action="LoginAction.action" method="post"> 用戶名:<input name="user1.user" type="text" /> 密碼:<input name="user1.pwd" type="password" /> <input value="提交" type="submit" /> </form> @LoginAction.java public class LoginAction extends ActionSupport { private User user1; public User getUser1() { return user1; } public void setUser1(User user1) { this.user1 = user1; } public String login(){ System.out.println(user1.getUser()); System.out.println(user1.getPwd()); return SUCCESS; } } @struts.xml <action name="LoginAction" class="com.imooc.action.LoginAction" method="login"> <result>/success.jsp</result> </action> @User.java public class User { private String user; private String pwd; public String getUser() { return user; } public void setUser(String user) { this.user = user; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } }
<!-- 使用ModelDriven接收參數(推薦) --> @login.jsp <form action="LoginAction.action" method="post"> 用戶名:<input name="user" type="text" /> 密碼:<input name="pwd" type="password" /> 書籍1:<input name="bookList[0].user" type="text" /> 書籍2:<input name="bookList[1].user" type="text" /> <input value="提交" type="submit" /> </form> @LoginAction.java public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user1 =new User(); public String login(){ System.out.println(user1.getUser()); System.out.println(user1.getPwd()); System.out.println(user1.getBookList().get(0).getUser()); System.out.println(user1.getBookList().get(1).getUser()); return SUCCESS; } public User getModel() { return user1; } } @struts.xml <action name="LoginAction" class="com.imooc.action.LoginAction" method="login"> <result>/success.jsp</result> </action> @User.java public class User { private String user; private String pwd; private List<User> bookList; //setter/getter... } 注意:request方式接收參數也行。
8.輸入數據校驗
@LoginAction.java public class LoginAction extends ActionSupport implements ModelDriven<User>{ private User user1 =new User(); public String login(){ /*if(user1.getUser()==null||"".equals(user1.getUser())){方法一 this.addFieldError("error_user", "用戶名不能爲空!"); return INPUT; }*/ System.out.println(user1.getUser()); System.out.println(user1.getPwd()); System.out.println(user1.getBookList().get(0).getUser()); System.out.println(user1.getBookList().get(1).getUser()); System.out.println(user1.getAge()); return SUCCESS; } public User getModel() { return user1; } @Override public void validate() {//方法二:推薦 if(user1.getUser()==null||"".equals(user1.getUser())){ this.addFieldError("error_user", "用戶名不能爲空!"); } } } @User.java public class User { private String user; private String pwd; private int age; private List<User> bookList; //setter/getter... } @login.jsp <%@ taglib prefix="s" uri="/struts-tags" %> <form action="LoginAction.action" method="post"> 用戶名:<input name="user" type="text" /><s:fielderror name="error_user"></s:fielderror> 密碼:<input name="pwd" type="password" /> 書籍1:<input name="bookList[0].user" type="text" /> 書籍2:<input name="bookList[1].user" type="text" /> 年齡:<input name="age" type="text" /> <input value="提交" type="submit" /> </form>
9.處理結果類型