`
javandroid
  • 浏览: 25616 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

【struts2笔记】

 
阅读更多
1.struts2中使用伪类,由spring来管理Action实例的创建
使用类名首字母小写的形式
如下所示:

说明:class并没有使用完整的包路径,而是使用的伪类形式
因为:
通常是用spring来管理struts的bean的创建。spring容器启动时就已经加载了applicationContext.xml中配置的bean。
所以我们在struts.xml中直接使用伪类形式配置就可以了。



2.Action配置的方式
如果Action类没有实际的业务功能,仅为了跳转页面,可以配置默认的Action实现类,只需要配置调用名称;
如果Action类具有实际业务功能,必须在Action类中书写对应业务逻辑


<action name="context">
	<result>/WEB-INF/jsps/context.jsp</result>
</action>
说明:iframe要跳转到context.jsp,但是context.jsp在WEB-INF下面。所以
①直接通过/WEB-INF/jsps/context.jsp
当然也可以使用action
②在action的结果集中配置跳转的jsp。

参数封装

struts2封装页面参数的三种方式:
1.属性驱动:pramam拦截器
User user;
2.模型驱动:modelDriver拦截器
User user=new User();
public User getModel(){
return user;
}
3.ognl注入方式(和属性驱动类似)
User user;
public void setUser(User user)

<input type="text" name="user.username"/>

或者
User user=new User();//直接new出来
<input type="text" name="user.username"/>


自定义拦截器

struts中当使用了自定义的拦截器后,默认的拦截器栈就不起作用了。
我们只需要将自定义的拦截器与默认的拦截器栈组合成为一个新的拦截器栈。我们将这个新的拦截器栈设为默认拦截器栈即可。
<!-- 声明自定义的拦截器和拦截器栈 -->
<interceptors>
	<!-- 登陆拦截器 -->
	<interceptor name="loginInterceptor" class="cn.itcast.invoice.util.interceptor.LoginInterceptor"></interceptor>
	
	<!-- 声明自定义拦截器栈 -->
	<interceptor-stack name="invoiceStack">
		<interceptor-ref name="loginInterceptor"/>
		<interceptor-ref name="defaultStack"/>
	</interceptor-stack>
</interceptors>

<!-- 使用自定义拦截器栈 -->
<default-interceptor-ref name="invoiceStack"/>

1.Action配置的方式
如果Action类没有实际的业务功能,仅仅是为了跳转页面可以配置默认的Action实现类,只需要配置调用名称;
如果Action类具有实际业务功能,必须在Action类中书写对应业务逻辑


<action name="context">
	<result>/WEB-INF/jsps/context.jsp</result>
</action>
说明:iframe要跳转到context.jsp,但是context.jsp在WEB-INF下面。所以
①直接通过/WEB-INF/jsps/context.jsp
当然也可以使用action
②在action的结果集中配置跳转的jsp。

文件上传

Struts2的文件上传是通过拦截器来实现的,为struts2的默认拦截器了,所以不用手工配置
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
该拦截器为commons-fileUpload,它会查看当前请求是否enctype=“multipart/form-data ”,如果不是则放行。如果是,则解析表单,然后把解析的结果传递给Action的属性。
一、单文件上传

fileUpload拦截器要求Action需要提供3个属性:
File fieldName
String fieldNameContentType;
String fieldNameFileName;

1.form表单中必须要有enctype=“multipart/form-data”

<form action="/UploadAction.action>" method="post" enctype="multipart/form-data">
	<input type="file" name="image"/>
</form>
2.Action中必须要有3个属性,并且前缀都必须与文件表单项名称一致
class MyAction {
   private File image;//封装上传文件的数据
   private String imageFileName;//封装上传文件的名称
   private String imageContentType;//封装上传文件的MIME类型
}


二、多文件上传


在表单中设置所有<input type=”file”>的名称为相同名称,然后在Action中给出数组属性即可。

<form action="/UploadsAction.action" method="post" enctype="multipart/form-data">
	用户名: <input type="text" name="username"/><br/>
	文 件1:<input type="file" name="myUpload"/><br/>
	文 件2:<input type="file" name="myUpload"/><br/>
	文 件3:<input type="file" name="myUpload"/><br/>
	<input type="submit" value="Submit"/>
</form>

public class UploadsAction extends ActionSupport {
	private File[] myUpload;
	private String[] myUploadContentType;
	private String[] myUploadFileName;
}

上传配置
可以通过Struts2的常量来完成对上传的配置,下面是与上传相关的常量:
struts.multipart.parser:指定使用的上传组件,默认值为jakarta,表示使用commons-fileupload组件,Struts2还支持cos和pell;
struts.multipart.saveDir:临时目录,如果没有指定临时目录,那么临时文件会在Tomcat的work目录中;
struts.multipart.maxSize:整个大小限制,默认值为2097152,即2M。注意,这个限制是整个请求的大小,而不是单一文件的大小。

<struts>
	<constant name="struts.devMode" value="true" />
	<!--请求总大小上限 -->
	<constant name="struts.multipart.maxSize" value="1048576" />
	<package name="s8" namespace="/" extends="struts-default">
		<action name="UploadAction" class="cn.itcast.upload.action.UploadAction">
			<result name="input">/demo1/upload.jsp</result>
			<param name="savepath">/WEB-INF/uploads</param>
			<!-- 指定当前action的拦截器为defaultStack栈,对fileUpload拦截器进行了参数配置。 -->
			<interceptor-ref name="defaultStack">
				<!-- 限制单个文件大小上限为512K -->
				<param name="fileUpload.maximumSize">524288[单个文件大小上限为512K]</param>
				<!-- 限制上传文件的类型 -->
				<param name="fileUpload.allowedExtensions">jpg,png,bmp</param>
			</interceptor-ref>
		</action>
	</package>
</struts>


<input type="file" name="image"/>
class MyAction {
   private File image;//封装上传文件的数据
   private String imageFileName;//封装的是上传文件的名称
   private String imageContentType;//封装的是上传文件的MIME类型
}
如上:Action中的3个属性前缀与表单中的name的值一致。(1:3)

下载是与响应相关的操作,在JavaWeb中下载要做如下操作:
1.设置Content-type响应头,其实这个头你不设置浏览器也会自己通过文件名来识别;
2.设置Disposition响应头,它默认值是inline,表示在页面中打开,下载时应该设置为attachment,表示让浏览器弹出下载框;
3.处理文件中乱码问题;
4.获取被下载文件,把被下载文件的内容写入到response.getOutputStream()流中;

文件下载

Struts2专门提供了一个stream类型的Result,它用来完成下载。
也就是说在下载时我们的Action中给出的<result>的type类型应该指定为stream。stream结果对应的结果类型为StreamResult类!这个类来完成设置响应头,以及向response.getOutputStream()中写入数据。

StreamResult类对Content-type提供的默认值为text/plain,这不是我们想要的,所以我们需要给StreamResult设置新的Cotnent-type。
StreamResult类对disposition头提供的默认值为inline,这也不是我们想要的,所以我们也需要给它设置为attachment。
在StreamResult类中提供了两个属性:contentType和contentDisposition,我们需要给这两个属性赋值,来替换默认值。


StreamResult类还要求Action提供一个getInputStream()方法,它会通过这个方法来获取一个InputStream对象,它会把这个流中的内容写入到response.getOutputStream()中。



download.jsp
<a href="<c:url value='/DownloadAction.action'/>">我的拍子</a>

DownloadAction
public class DownloadAction extends ActionSupport {
   //必须有getInputStream()方法,StreamResult会调用这个方法来获取被下载资源对应的输入流对象。
	public InputStream getInputStream() throws FileNotFoundException {
		return new FileInputStream("F:\\我的拍子.jpg");
	}
	public String execute() throws Exception {
		return SUCCESS;
	}
}

struts.xml
<action name="DownloadAction" class="cn.java.action.DownloadAction">
	<result type="stream">
		<param name="contentType">image/jpeg</param>
		<param name="contentDisposition">attachment;filename=a.jpg</param>
	</result>
</action>

OGNL表达式获取Action属性值

上例中要下载的文件是硬编码,文件的ContentType类型是硬编码,下载框中的文件名也是硬编码,这些都是需要处理的。
DownloadAction
public class Download1Action extends ActionSupport {
	private String downloadDir;
	private InputStream inputStream;
	private String filename;
	//<span style="font-family: Arial, Helvetica, sans-serif;">获取<action>元素的<param>参数</span>
	public void setDownloadDir(String downloadDir) {
		this.downloadDir = ServletActionContext.getServletContext().getRealPath(downloadDir);//<span style="font-family: Arial, Helvetica, sans-serif;">获取真实路径</span>
	}
        //用来设置表单数据到Action中
	public void setFilename(String filename) throws UnsupportedEncodingException {
		// 因为是GET请求,所以需要处理编码问题
		this.filename = new String(filename.getBytes("iso-8859-1"), "utf-8");
	}
        //在<result>元素下的<param>中使用了${filename},这相当于调用了本方法。
	public String getFilename() throws UnsupportedEncodingException {
		// 在下载框中显示的文件名需要处理编码问题
		return new String(filename.getBytes("GBK"), "iso-8859-1");//处理下载框中的编码问题。
	}
	
	public String getContentType[在<result>元素下的<param>中使用了${contentType}这相当于调用了本方法]() {
		// 文件的MIME类型
		return ServletActionContext.getServletContext().getMimeType(filename);//通过文件名称获取对应的MIME类型
	}
    //[返回被下载对象对应的流对象。这个方法会被StreamResult对象调用。]
	public InputStream getInputStream() throws FileNotFoundException {
		return this.inputStream;
	}

	public String execute() throws Exception {
	//通过下载目录和文件名创建文件流对象
		File file = new File(downloadDir, filename);
		inputStream = new FileInputStream(file);
		return SUCCESS;
	}
}
struts.xml
<action name="Download1Action" class="cn.itcast.download.action.Download1Action">
	<param name="downloadDir">/WEB-INF/downloads</param>
	<result type="stream" name="success">
	     <!--[OGNL表达式,相当于调用action对象的getContentType()方法]-->
		<param name="contentType">${contentType}</param>
		<!--[同上]-->
		<param name="contentDisposition">attachment;filename=${filename}</param>
	</result>
</action>




分享到:
评论

相关推荐

    Struts2笔记,看完一遍,保证你学会Struts2,最权威的笔记!!!

    Struts2笔记 本人工作中积累的,故做成笔记以供大家一起学习进步. 模块分的非常详细,各个细节都会关注到,只挑选其精华,工作中用得到的技术!!! 不要看资源小,起到的作用却非常大!!!

    struts2笔记

    本笔记将深入探讨Struts2的核心概念、执行流程、类型转换、输入验证和国际化等方面。 **一、Struts2框架基础** Struts2是Apache软件基金会的一个开源项目,它是基于拦截器的MVC框架,继承了WebWork框架的优点。...

    黑马程序员Struts2笔记

    本笔记主要涵盖了Struts2的基础知识,包括但不限于配置、Action、拦截器、结果类型以及异常处理等内容。 1. **Struts2框架简介** Struts2是Apache软件基金会的一个开源项目,它是Struts1的升级版,弥补了Struts1在...

    马士兵Struts2笔记2013

    Struts2是一个流行的Java web框架,...以上就是"马士兵Struts2笔记2013"中涉及的主要知识点,这些内容涵盖了Struts2的基础配置、数据处理、验证、调试以及与视图层的交互等方面,对于理解和掌握Struts2框架非常有帮助。

    Struts2笔记

    ### Struts2框架核心概念与工作原理 #### 一、框架概述 Struts2是Apache组织维护的一个开源项目,它是Struts1的升级版本,在设计理念和技术实现上都有较大的改进。Struts2是一个基于MVC(Model-View-Controller)...

    struts2笔记html版本

    8. ** strut2显示图笔记**:这个笔记可能包含了Struts2架构的可视化表示,帮助理解各个组件之间的关系和工作流程,包括Action、Interceptor、Value Stack等的交互过程。 通过阅读这个HTML版的Struts2笔记,开发者...

    圣思园struts2笔记

    本笔记主要涵盖了圣思园张龙老师在教学过程中讲解的Struts2核心概念与实战技巧。 首先,我们来了解Struts2的基本架构。Struts2框架通过拦截器(Interceptor)机制实现了对HTTP请求的处理,这些拦截器可以实现如日志...

    赵栋struts2 笔记

    赵栋的Struts2笔记主要涵盖了2013年的相关知识,以下是根据笔记内容提炼出的一些关键知识点: 1. **URL与Action方法绑定**: 在Struts2中,通过URL直接调用Action类的方法是可能的。如果在URL中附加"!"后跟方法名...

    Struts2笔记+Hibernate3.6笔记+Spring3笔记

    **Struts2笔记** Struts2是MVC(模型-视图-控制器)设计模式的一个实现,它为Java Web开发提供了强大的控制层。Struts2的核心是Action类,它处理用户请求并调用业务逻辑。以下是一些关键知识点: 1. **...

    struts2笔记_初步修改版_.

    在“Struts2笔记_初步修改版_”中,我们可能会涵盖以下关键知识点: 1. **Struts2架构**:Struts2的核心是Action类,它是处理用户请求的中心。Action类与业务逻辑层交互,并通过Result返回视图。Struts2使用拦截器...

    struts2笔记 Word文档

    Struts2是一个强大的Java web应用程序开发框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了...通过阅读"struts2笔记[初步修改版].doc",读者将能够更深入地了解这个框架,并在实际项目中灵活运用。

    struts2笔记和代码

    总的来说,"struts2笔记和代码"涵盖了Struts2框架的基本原理、配置、拦截器、Action实现、视图展现以及实践应用等多个方面,对于学习和掌握Struts2具有很高的价值。通过深入研究这些笔记和代码,开发者不仅可以理解...

    Struts2 笔记代码

    在这个"Struts2笔记代码"压缩包中,很可能是包含了一系列与Struts2相关的示例代码和学习资料。 Struts2的核心特性包括: 1. **Action类和结果类型**:Action类是业务逻辑的载体,负责处理用户的请求。每个Action...

    servlet和struts2笔记

    ### servlet和struts2笔记 #### 一、Servlet 基础 **Servlet** 是 Java Web 开发中的一种核心技术,它被设计用于处理客户端发送到服务器的 HTTP 请求,并且能够生成响应。Servlet 可以看作是服务器端的小程序,...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts2学习笔记(完美总结)——转自OPEN经验库

    Struts2是一个强大的Java web应用程序开发框架,它遵循Model-View-Controller (MVC)设计模式,用于构建可维护性和可扩展性高的企业级应用。本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与...

    Struts2 笔记

    Struts2笔记PDF文件可能包含了对这个框架的深入理解和实践指导。 在Struts2中,核心概念包括Action、Result、Interceptor(拦截器)和Value Stack。Action是业务逻辑的载体,它处理用户请求并执行相应的业务操作。...

    三、Servlet_jsp_Struts2笔记

    Servlet、JSP、Struts2笔记 Servlet基础 Servlet是运行在服务器上的程序,使用Java语言编译,并且使用Servlet接口来实现动态界面。Servlet需要接受客户端发送的请求,并将处理结果以响应的形式响应给客户端。 ...

Global site tag (gtag.js) - Google Analytics