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.处理结果类型