struts2

Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller),像servlet中的Filter管理用户请求,建立模型与视图的数据交互。

实际上struts在web的配置文件中就是以过滤器filter的形式配置的。

 

ONGL表达式:就是对象图形化导航语言,在前端页面中,访问action的属性

 

interceptor拦截器

工作流程:

(1)客户端浏览器发送HTTP请求到Web应用

(2)Web容器将请求传递到标准ActionContextCleanUp过滤器以消除属性,而不让后续过滤器清楚,以延长Action中属性(包括自定义属性)的生命周期。

(3)再经过如stimesh等其他过滤器后,请求传递给StrutsPrepareAndExecuteFilter核心控制器

(4)StrutsPrepareAndExecuteFilter调用ActionMapper(Action映射器)确定调用哪个Action,再将控制权转移给ActionProxy代理

(5)ActionProxy代理调用配置管理器ConfigurationManager从配置文件struts.xml中读取配置信息,然后创建ActionInvocation对象

(6)ActionInvocation在调用拦截器链中的拦截器后再调用Action,根据Action返回的结果字符串查找对应的Result

(7)Result调用视图模板,再以相反的顺序执行拦截器链,返回HTTP响应

(8)HTTP响应以相反的顺序返回给核心控制器StrutsPrepareAndExecuteFilter以及其他web.xml中定义的过滤器,最终返回给客户端

 

配置文件

1.Default.properties struts的一些默认配置

2.Struts-default.xml struts关系类和拦截器的默认设置

 

3.Struts-plugin.xml

4.Struts.xml 用户配置的struts工程配置文件

5.web.xml

 

struts配置文件

1 package元素,一个配置文件只有一个,相当于一个struts项目。

属性 name,namespace,extends,abstruct。

namespace主要是与action标签的name属性联合使用来确定一个 action的访问路径,及在浏览器的访问路径,默认不配。

extends, 一般值是struts-default,struts-default包是  在struts-default.xml文件中声明的。

2 action元素,name,class,method,一个action对应处理一个请求,及链接,package下可以有多个action。

name属性为a标签的超链接href的值,去除后缀。

class属性是处理请求所需要的类,及类的全路径,从package开始。

method,该类处理的方法,默认方法为execute.

3 result元素,action元素的子元素,name,type属性。

name及根据方法设置的放回值,默认是SUCCESS字符串,与action中的method方法的返回值匹配。

type属性是跳转的方法,比如重定向,转发。

 

action标签对应的ACTION类要求。

ACTION类是一个POJO类,struts通过反射机制建立类,所以要给所有类的属性提供getter,setter的方法,以及无参的构造器。

struts为每一个HTTP请求创建一个action类的实例,所以action类是线程安全的。

ACTION类获取servlet的相关属性,如request,reponse等属性的方法。

1

action类继承了ActionSupport

servletActionContext获取

request: ServletActionContext.getRequest();

response: ServletActionContext.getResponse();

servletContext: ServletActionContext.getServletContext();

2

采用注入的方式

Struts2框架在运行时,请求会被StrutsPrepareAndExecuteFilter拦截,会根据请求,去strtus.xml文件中查找到匹配的action,在action执行前,会走一些interceptor,默认执行的拦截器是struts-default.xml文件中定义的。

ServletRequestAware, 实现这个接口可以获取HttpServletRequest;

ServletResponseAware ,实现这个接口可以获取HttpServletResponse;

ServletContextAware 实现这个接口可以获取ServletContext;

 

属性封装

struts会将请求页面中的输入类型标签或者其余标签的name值,根据配置文件的配置,在创建相应的ACTION类时,根据ACTION类的属性同名为它赋予值。

 

application, session,parameter等对象都以map方式存储在actioncontext对象中,其中get(‘request’)方式获取request。

 

模型驱动

将ACTION类的所以属性提取出来形成一个实体类,包装成Model,在本ACTION类中不用setter,getter方法,而是通过实体类的setter,getter方法注入属性,ACTION类调用实体类方法,使用属性。

实体类要成为ACTION类的属性,并在ACTION类中用new 创建一个实例。

ACTION类实现ModelDriven<Object>接口,Object及实体类。


 3 public class User {
 4     private String userName;
 5     private String pwd;
 6     public String getUserName() {
 7         return userName;
 8     }
 9     public void setUserName(String userName) {
10         this.userName = userName;
11     }
12     public String getPwd() {
13         return pwd;
14     }
15     public void setPwd(String pwd) {
16         this.pwd = pwd;
17     }
18 }
19 //--------action---------------------------------

21 
22 import java.util.ArrayList;
23 import java.util.List;
24 
25 import com.opensymphony.xwork2.ActionSupport;
26 import com.opensymphony.xwork2.ModelDriven;
27 
28 public class UserAction extends ActionSupport implements ModelDriven<User>{
29 
30     private User user = new User();
31     public User getUser() {
32         return user;
33     }
34     public void setUser(User user) {
35         this.user = user;
36     }
37     public User getModel() {
38         return this.user;
39     }
40     public String add(){
41         List<Object> list = new ArrayList<Object>();
42         list.add(user);
43         return SUCCESS;
44     }
45 }

OGNL表达式

1 要求struts处理的请求是\*,不能是.action,.do而已

2 在页面插入<%@ taglib uri="/struts-tags" prefix="s"%>

3 使用OGNL

 

valueStack(值栈)

valueStack的主要目的是为action中产生的数据携带到页面上,也就是说valueStack它就是一个容器,在Struts2框架中将valueStack设计成一个接口,当客户端向我们发送一个请求,服务器就会创始一个Action来处理请求,struts2中的action是一个多例,每一次请求都会有一个新的action对应。所以它不存在线程安全问题,一个valueStack对应一个action,valueStack贯穿整个action的生命周期,struts2框架将valueStack保存在request中。

 

valueStack主要有两部分组成:

CompoundRoot:它就是一个ArrayList它主要存储的是action的相关数据;

Map<String,Object> context:就是一个Map,Context中主要存储了一些引用,这个引用主要是关于web开发中相关信息;

 

pameters :请求参数;

request:请求对象中所有属性;

session:会话对象中所有属性;

application:application对象中的所有发展;

 

获取ValueStack

(1) 通过request对象来获取;

   ValueStack  vs =  (ValueStack)ServletActionContext.getRequest().getAttribute(ServletActionContext.STURTS_VALUESTACK_KEY);

(2) 通过ActionContext来获取

ValueStack  vs =  ActionContext.getServletContext()getValueStack();

 

Interceptor拦截器

 

<s:debug></>在页面加上这行代码,可以查看属性状态

文件上传

 

<s:form action="fileaction" method="post" enctype="multipart/form-data">

    <s:file name="text" label="text"></s:file>

    <s:textfield name="wenben" label="wenben"></s:textfield>

    <s:submit></s:submit>

</s:form>

 

文件上传的ACTION中要有三个基本属性。

1 文件对象File

2 文件的类型FileContentType

3 文件的名字FileName

其中文件对象在action要和表单的file中的name相同,其余两个命名遵守[file-name]ContentType,[file-name]FileName,方式命名。

 

然后在struts.xml文件配制相应的ACTION即可,在配置result时,struts默认上传或下载出错,会内部返回一个INPUT视图,所有可以设置一个result的name=’input’,当请求资源出错时,直接跳转相应的页面。

public class Upload extends ActionSupport{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private File text;
	private String wenben;
	private String textFileName;
	private String textContentType;

	public Upload() {

	}
。。。。。。


}public String execute() throws Exception{
		
		try {
		System.out.println(this);
		ServletContext application=ServletActionContext.getServletContext();
		String filePath=application.getRealPath("/file");//获取真实目录
                                 System.out.println(filePath);
                                       File file=new File(filePath);//在真实目录下创建一个新的文件
        if (!file.exists()) {
			file.mkdirs();
		}
        text.renameTo(new File(file,textFileName));
		}
		catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return ERROR;
		}

 

文件上传成功后,要立即保存,不然struts的过滤器将会删除文件。

 

文件的下载

文件的下载提供一个ACTION类获取文件的类型,长度,响应头三个重要的信息,无需多余的视图页面,除了INPUT出错视图。

在配置文件中设置result的type类型改成stream,再action中设置超链接的name值。

此结果类型采用以下参数:

 

contentType-发送到Web浏览器的流mime类型(默认= text/plain)。

contentLength-流的长度(以字节为单位)(浏览器显示进度条)。

contentDisposition-用于指定文件名的内容处置标头值(默认= inline,值通常是 附件; filename =“ document.pdf”。

inputName-链式操作中InputStream属性的名称(默认= inputStream)。

bufferSize-从输入复制到输出的缓冲区的大小(默认= 1024)。

allowCaching如果设置为“ false”,则会将标头“ Pragma”和“ Cache-Control”设置为“ no-cahce”,并防止客户端缓存内容。(默认= true)

只有前三个参数需要动态提供,后两个可以再配置文件中设置。

 

//配置文件的配置
<action name="load" class="mc.Down" method="execute">
<result type="stream">
<param name="bufferSize">2048</param>
</result>
</action>

//下载ACTION类
public class Down extends ActionSupport {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
    
    private String contentType;
	private long contentLength;
	private String ContentDisposition;
	private InputStream inputStream; //默认
	


	public String getContentType() {
		return contentType;
	}

	public void setContentType(String contentType) {
		this.contentType = contentType;
	}

	public long getContentLength() {
		return contentLength;
	}

	public void setContentLength(long contentLength) {
		this.contentLength = contentLength;
	}

	public String getContentDisposition() {
		return ContentDisposition;
	}

	public void setContentDisposition(String contentDisposition) {
		ContentDisposition = contentDisposition;
	}

	
	public InputStream getInputStream() {
		return inputStream;
	}

	

	@Override
	public String execute() throws Exception{
		contentType="text/html";
		ContentDisposition="attachment;filename=kk.html";//attachment固定,
		ServletContext servletContext=ServletActionContext.getServletContext();
		String path=servletContext.getRealPath("/file/kk.html");
		inputStream=new FileInputStream(path);
		inputStream.available();
		
		return SUCCESS;
	}
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值