一、通过属性自动赋值
1.配置 web.xml--配置 struts2 的核心过滤器
<filter>
<filter-name>struts2</filter-name>
<filterclass>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Login.jsp编写
<body>
<form action="login.action" method="post">
用户名:<input type="text" name="name"/><br>
密码:<input type="password" name="pwd"/><br>
<input type="submit" value="登录"/>
</form>
</body>
注:action 的提交地址.action 是扩展名,默认为.action;action 的扩展名和 web.xml 中配 置的 struts2 的核心过滤器相匹配;也就是如果表单中提交的地址以.action 结尾,那么在配 置 filter 的 url-pattern 时一定是:<url-pattern>*.action</url-pattern>;
3.编写 LoginAction 类
package com.xijian.pojo;
public class LoginAction {
private String name;
private String pwd; // 处理方法
public String execute() {
if ("siggy".equals(name) && "1111".equals(pwd)) {
return "success";
} else {
return "failed";
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
}
注:LoginAction 中的属性名和表单中表单元素的名称要一致。并且为属性提供 get/set 方法。Struts2 自动将用户提交的表单数据设置 到 LoginAction 的对应属性上。并且在 jsp 中可以直接获取,不用手动向 request 设 置。
4.在 struts.xml 中配置 LoginAction
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="cn.sxt.action.LoginAction">
<result name="success">/success.jsp</result>
<result name="failed">/login.jsp</result>
</action>
</package>
5.在success.jsp页面上可以获取到在login.jsp中提交的数据
二、执行流程
简单执行流程:
当用户提交一个请求,服务器接收,并且交给 struts2 的核心过滤器来进行处理,struts2 的过滤器调用 struts2 的一系列处理器来进行处理(如:解析 struts.xml 配置文件,和用户提 交的请求对比,如果找不到返回 404,如果找到进行下一步处理。)直到调用对应的 Action 类中的 execute 方法执行,执行完后再进行一系列处理到核心过滤器。由核心过滤器返回给服务器,服务器对浏览器进行相应的响应。
详细流程:
三、Structs2是线程安全的
线程安全:在一个进程中有多个线程并发执行,每个线程执行过程中,变量值是相同的, 执行结果也是相同的。
每次请求都会重新创建新的 action 对象,所以线程安全。 由于 action 对象是 struts2通过反射生成的,所以要求 Action 类要有一个公共的无参构造方法。
四、配置文件Structs.xml
1、常量配置方式一
1)乱码解决
<!-- 乱码解决 --> <constant name="struts.i18n.encoding" value="UTF-8"/> |
2)自定义扩展名
<!-- 自定义扩展名 --> <constant name="struts.action.extension" value="action,,siggy"/> |
3)友好的提示信息
可以实现配置文件的热部署
<!-- 设置开发模式 --> <constant name="struts.devMode" value="true"/> |
4)设置配置文件修改后自动加载--推荐在开发中使用
<constant name="struts.configuration.xml.reload" value="true"/> |
2、常量配置方式二
在 src 下添加 struts.properties 配置文件
3、团队协作开发配置
通过 include 添加不同人员的配置文件
<include file="config/sxt/struts/user.xml"/> |
4、配置文件加载顺序
struts-default.xml---->struts-plugin.xml---->struts.xml
5、package 的配置
<!-- 包的名称自定义,可以配置多个包;namespace 命名空间:不同模块可以 指定不同的空间 extends 值是直接或者间接继承 struts-default --> <package name="user" namespace="/" extends="struts-default"> |
6、action 的配置
<!-- name 是 url 请求名,不需要加后缀(.action) class 是处理 url 请求对应的 java 类,class 要求包名+类名 并且该类是由公共的无参构造方法的。 method 配置处理请求类的处理的方法,默认为 execute;方法要满 足是公共的,返回值类型是 String,无参 method 和 name 无关 --> <action name="login" class="cn.sxt.action.LoginAction"> |
7、result 配置
<!-- result-指结果集 name:匹配请求处理方法的返回值;默认是 success type:结果处理类型;默认是 dispather 转发type 有哪些: <result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/> <result-type name="freemarker" class="org.apache.struts2.views.freemarker.FreemarkerResult"/> <result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/> <result-type name="redirect" class="org.apache.struts2.dispatcher.ServletRedirectResult"/> <result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResu lt"/> <result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/> <result-type name="velocity" class="org.apache.struts2.dispatcher.VelocityResult"/> <result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/> <result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" /> chain:指 action 链,链接下一个 action;执行 actionA 以 后直接执行 ActionB 后直接执行 ActionC,用得较少,地址栏是执行的第一 action ***dispatcher:转发;和 servlet 一致。如果 request 中有数据要到视图显示,那么使用 dispatcher ***redirect:重定向;如果是重定向到 jsp 页面,可以直接 重定向,如果是重定向到另一个 action,需注意 是否配置了 action 的后缀名。如果要求有后缀名,那么重定向的 action 一定要加上后缀名 ***redirectAction:重定向导另一个 action;不用加 action 的后缀名,会将前一个 action 的后缀名自动加上 ***stream:以流的形式显示---文件下载 --> <result type="redirectAction">logout</result> |
8、全局配置
<!-- 配置全局结果集 --> <global-results> <result name="login">/login.jsp</result> </global-results> |
在 action 的配置中,如果不去配置 class 属性,将会由默认的 action 来执行,默认的 action 是 ActionSuppot 类。
<!-- 配置默认的 Action 当所请求的 action 不存在时,那么执行默认的 action--> <default-action-ref name="default"/> <!-- 配置默认执行的 class --> <default-class-ref class="cn.sxt.action.AddAction"/> |
9、通配符的配置
<!-- 使用通配符来配置 action,可以减少 action 的配置 *表示匹配所有,占 位符用{1}表示第一个*所代表的内容 --> <action name="user*" class="cn.sxt.action.AddAction" method="{1}"> <result>/index.jsp</result> </action> |
10、减少 action 的配置还可以使用 DMI(动态方法调用),不推荐,因为存在安全隐患