struts2原理及基本应用

struts2工作原理
1、tomcat启动,会先去读取web.xml文件;然后会去初始化struts2核心过滤器StrutsPrepareAndExecuteFilter,在该过滤器中第一次会调用过滤器中的init方法进行初始化,而初始化方法中就有一个对象,Dispatcher对象,该对象会去读取并解析struts2.xml,struts-default.xml等文件。
2、客户端向服务器发送请求,服务器将请求转交给struts2核心过滤器,该过滤器将请求和struts.xml文件中的package节点中的namespace的属性值加上action的name属性值相匹配;如果匹配,则创建action代理类,并创建action请求对象中对应的拦截器,形成一个拦截器链,执行完Interceptor链中所有的拦截器后,才会执行Action类中默认处理方法execute()
3、struts2根据处理方法返回的结果字符串和struts.xml文件中对应的result节点的值去匹配,匹配完之后,根据struts2提供的模板生成页面,将其处理结果生成一个一个页面,存入response中,然后又按之前经过拦截器相反的顺序,将响应信息传递给前端页面进行显示。


获取页面中的值:
1、属性驱动,直接在action类中编写属性,提供get,set方。在action类中的属性名和jsp页面中请求的name保持一致。
2、模型驱动,action类实现ModelDriven<对应表单属性的实体类>,实现getModel()方法,在该方法中显示的new一个实体类并返回。注:该对象在访问Action类的时候,这些组件全部会自动的被struts2的过滤器,拦截器注入数据进去。
3、通过获取request,response等这些对象来获取页面请求的数据。

文件的上传和下载:
上传:
1、在struts2中想要使用文件上传和下载的功能需要导入额外的apache的jar包。
2、设置form表单的表单提交方式为enctype=“multipart/form-data”,然后表单提交方式为post
3、在action处理方法中设置设置三个属性,第一个,File 变量名为表单的input框的文件上传name属性值,第二个,表单的input框的文件上传name属性值加上ContentType,第三个,表单的input框的文件上传name属性值加上FileName,因为在strust2中的FieluploadInterceptor拦截器中这三个名字就是这样存入值栈的;如果不同名字的话,则会出现属性不能自动注入的问题。
    在action类中处理文件就可以了,可以通过原生的IO流将内容写入到tomcat服务器中,也可以使用apache提供的工具包中的**FileUtils.copyFile()**将文件上传。
4、在struts2.xml文件中配置处理文件上传的action的配置信息。
例如:

	<action name="uploadAction" class="com.ztkj.action.UploadAction">
		<result name="success">success.jsp</result>
		<interceptor-ref name="defaultStack"/>
		<interceptor-ref name="fileUpload">
			<!--这两个param名字和fileUpload拦截器中的属性名是一致的-->
			<param name="maximumSize">800000</param>
			<param name="allowedTypes">text/plain,image/jpeg,image/png</param>
		</interceptor-ref>
	</action>

下载
1、在actino类中创建一个InputStream属性,然后提供get和set方法。既然客户端想要下载一个文件,那肯定这个文件是服务器中所存在的文件名,action类获取到客户端请求的文件名,然后就相对应的获取到了该文件所对应再服务器端的文件路径,通过该路径就可以创建一个File对象,然后创建出InputStream对象。
2、再struts2.xml文件中配置,result的type类型为stream,设置响应的参数因为stream在后台实际上对应的也是一个拦截器,而拦截器中的处理实际上就是,将inputStream中的数据读取出来,然后将其写入到response中。而前端页面就可以直接获取了。这也是为什么这里需要传一个is,这个is就是action类中的一个InputStream输入流。
注意:前端的页面可以直接通过<img 标签中的src属性直接访问该action,然后直接显示出来。img标签的src底层应该也是做了一定的处理。

	<action name="down" class="com.ztkj.action.DownAction">
    		<result name="success" type="stream">
    			<param name="contentDisposition">attachment;fileName=${fileName}</param>
    			<param name="inputName">is</param>
    		</result>
    		<interceptor-ref name="defaultStack"/>
    	</action>

ajxa请求:
1、struts2处理ajax请求需要使用到额外的jar包,例如:json-lib.jar。
2、在action中直接使用属性驱动或者ModelDriven模型驱动,获取前端传递过来的ajax请求参数,action处理方法处理业务,返回一个字符串。
3、在struts2.xml配置文件设置package的extends这里不能设置成struts-default因为在struts2的默认这个package中没有处理ajax的拦截器,因此要使用json-default,然后配置result节点信息,type为json当然这里其实在底层也是对应了一个json的interceptor拦截器,其内部就是去处理这些传递过去的java数据,然后将其转成json对象,然后写入response中。需要注意的是这里需要配置一个param节点name为root,value值为action处理方法中的结果数据。
例如:

	<package name="ajax" namespace="/" extends="json-default">
	   	<action name="ajaxAction" class="com.ztkj.action.AjaxAction">
	   		<result name="success" type="json">
	   			<!--json所对应的拦截器中有一个属性root,接收action类处理方法传递过去的数据-->
				<param name="root">list</param>	   			
	   		</result>
	   	</action>
	</package>

4、前端就可以通过ajax去处理响应的数据了。




注意:
    1、在struts2中如果让一个action节点显示的引用一个interceptor的话,则其默认的defaultStack拦截器栈则会失效,因此也要显示的引用一下defaultStack。除非你不想使用默认的拦截器中的功能。
    2、在struts2中如果在action前面使用一个interceptor-ref name="“引用一个拦截器或者拦截器栈,则在该interceptor-ref name=”"节点后面的所有的action节点都会引用该拦截器。
    3、可以使用global-results标签定义全局的result节点,然后对应的package继承这个package,那相对应的它也有这个全局的result节点了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值