JavaEE框架学习笔记——struts篇

文章部分内容整理自郭永锋视频教学内容!   

目录

1、struts配置文件的加载顺序

2、struts框架执行流程

3、动作类的三种写法

4、result元素type属性取值

5、动作类中的servlet api访问(两种方式)

6、Action接收请求参数的方式

7、自定义拦截器

8、解决自定义拦截器后struts默认拦截器失效问题

9、防止表单重复提


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框架执行流程

  1. tomcat启动,加载web.xml
  2. 实例化并初始化过滤器
  3. 加载struts.xml配置文件
  4. 客户端发送请求:hello
  5. 请求到达过滤器
  6. 截取请求的动作名称name,并在struts.xml中找到对应动作
  7. 找到动作后实例化动作类
  8. 调用对应的动作方法method,方法有返回值
  9. 根据返回值找到name取值对应的结果视图,即对应的success.jsp页面
  10. 响应浏览器,展示结果

3、动作类的三种写法

  1. 直接在写个Action类,不需要继承任何类,然后在struts.xml中配置
  2. 写个Action类实现Action接口,然后实现excute方法
  3. 写个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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章