文章部分内容整理自郭永锋视频教学内容!
目录
1、struts配置文件的加载顺序
顺序 |
配置文件名 |
所在位置 |
说明 |
1 |
default.properties |
struts2-core-2.3.15.3.jar\org\apache\struts2 |
不能修改 |
2 |
struts-default.xml |
struts2-core-2.3.15.3.jar |
不能修改 |
3 |
strtuts-plugin.xml |
在struts2提供的插件jar包中 |
不能修改 |
4 |
struts.xml |
我们的应用中 |
可以修改的:推荐 |
5 |
struts.properties |
我们的应用中 |
可以修改的 |
6 |
web.xml |
我们的应用中 |
可以修改的,可以给过滤器配置参数 |
2、struts框架执行流程
- tomcat启动,加载web.xml
- 实例化并初始化过滤器
- 加载struts.xml配置文件
- 客户端发送请求:hello
- 请求到达过滤器
- 截取请求的动作名称name,并在struts.xml中找到对应动作
- 找到动作后实例化动作类
- 调用对应的动作方法method,方法有返回值
- 根据返回值找到name取值对应的结果视图,即对应的success.jsp页面
- 响应浏览器,展示结果
3、动作类的三种写法
- 直接在写个Action类,不需要继承任何类,然后在struts.xml中配置
- 写个Action类实现Action接口,然后实现excute方法
- 写个Action类继承ActionSuport类【推荐使用这种方式】
4、result元素type属性取值
dispatcher |
(默认值)使用请求转发,转向一个页面。 |
redirect |
使用重定向,转向一个页面。 |
chain |
转发到另一个相同名称空间的动作 转发到不同名称空间的动作 |
redirectAction |
重定向到另一个相同名称空间的动作 重定向到不同名称空间的动作 |
5、动作类中的servlet api访问(两种方式)
- 通过ServletActionContext获取 【推荐使用】
public class TestAction extends ActionSupport{
public String test(){
//获取servlet 的api方式
//第一种方式:通过ServletActionContext
//1.response
HttpServletResponse response = ServletActionContext.getResponse();
//2.request
HttpServletRequest request = ServletActionContext.getRequest();
//3.session
HttpSession session = request.getSession();
//4.application【ServletContext】
ServletContext application = ServletActionContext.getServletContext();
//NONE不跳转,也就是不用找result标签
return NONE;
}
}
-
通过注入方式:先让Action实现两个接口ServletRequestAware,ServletResponseAware,ServletContextAware
public class Test2Action extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
HttpServletResponse response;
HttpServletRequest request;
ServletContext application;
public String test(){
//第二种方式:通过实现接口,让struts自动注入
/**
* Aware:注入,调用方法,注入参数
*/
System.out.println(request);
System.out.println(response);
System.out.println(application);
//NONE不跳转,也就是不用找result标签
return NONE;
}
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
@Override
public void setServletContext(ServletContext context) {
this.application = context;
}
}
6、Action接收请求参数的方式
- 通过servlet方式获取
HttpServletRequest request = ServletActionContext.getRequest();
String username = request.getParameter("username");
- 通过Action模型驱动封装参数【常用】
index.jsp |
UserAction.java |
7、自定义拦截器
- 创建个拦截器,继承Abastract方法,实现intercept方法。其中invocation.invoke()是放行通过。
-
在struts.xml中配置拦截器,拦截器需要配置后才可使用
8、解决自定义拦截器后struts默认拦截器失效问题
方法一: 把默认拦截器加到配置
方法二: 抽取一个拦截器分组
方法三: 修改默认的拦截器
修改的默认的拦截器后,所有的Action方法都会被拦截,而登录方法是不需要拦截的
解决需要通过AbstractInterceptor类的子类入手,通过查看发现,该类还有一个子类是抽象的,可以通过MethodFilter过滤方法,如图:
解决步骤:
修改拦截器的继承结构 |
修改struts.xml文件,注册过滤方法 |
上面遗留的问题:我们在声明时配置了哪些方法需要拦截,哪些方法不需要拦截。但是在没有写动作类和动作方法之前,我们不确定方法名叫什么。
解决办法:我们在写action需要使用拦截器的时候再给它注入参数。
9、防止表单重复提
(1)Servelt的表单重复提交的一种解决方案:验证码。服务器端对比验证码一致后从session中移除验证码,若对比验证码不一致则代表重复提交。
(2)Struts的表单重复提交解决方案
方法一:使用重定向
方法二:使用<s:token/>生成令牌配合tokensession拦截器
jsp |
Struts.xml |