前段时间大致看了看《轻量级Java EE企业应用实战》,说实话真心感觉没看多懂,其中看的最明白一点的就是struts2了,但也是基本不懂的状态。最近又该学ssh框架了,只能找相关的培训视频来系统的学习,当然时间也不是太多,所以只能快速进行重点的知识点的学习,这里记录一下大致过程,方便复习和巩固。
首先,struts2是基于对Filter的封装而不是Servlet,因为Filter比Servlet更强大,Servlet能干的事,Filter基本上都能干,反过来则不行。
配置:
struts2配置大致分为三步:
- 导入jar包,可以把struts2的实例文件struts2-blank的lib文件都拷到项目下,较为方便。
- 配置web.xml ,这里直接copy一下就行了,基本上就是配置一个Filter
<filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
配置struts2.xml,基本上把实例的拷过来自己改改就行了
- 关联struts2.xml中的“http://struts.apache.org/dtds/struts-2.3.dtd”以实现struts代码的提示
关于struts.xml:
package:作为struts2组织模块的一个单位,可以把一类的action放在一个package中,比如用户管理模块。
属性:name:标示一个package
namespace:命名空间,默认"/",如果加了,在请求url中action前必须加入
extends:继承的包,默认是 struts-default
action:对应每一个请求都有一个action相对应,用来处理请求,可以理解为电话转接台
name:对应一个 struts2 的请求的名字(或对一个 servletPath, 但去除 / 和扩展名), 不包含扩展名
class:要处理请求的类的名称(包括包名),默认值为: com.opensymphony.xwork2.ActionSupport
method :要处理请求的类中的处理方法, 默认是execute
result:返回的结果以及根据结果的处置。
简单示例:
<struts> <package name="default" namespace="/" extends="struts-default"> <action name="actiontest1" class="jsky.action.ActionTestAction"> <result>/pages/show.jsp</result> </action> <action name="actiontest2" class="jsky.action.ActionTestAction" method="log"> <result name="success" >/pages/show2.jsp</result> <result name="error" >/pages/error2.jsp</result> </action> </package> </struts>
在Action中获取web资源:
在Action中有时需要对域对象进行处理,这就涉及到对web资源的访问问题。访问web资源两种方式,一种是和Servlet解耦的,但是可以访问的资源很有限,一种是和Servlet耦合的,但是可以访问很多资源。
- 解耦方式(可以读取请求参数, 读写域对象的属性, 使 session 失效等)
一种是使用 ActionContext,一种是实现xxxAware 接口(xxx代表application,session,request)。一般当处理类中需要多次使用域对象的map或 parameters使用aware接口。
- 耦合方式(可以访问的方法更多,而且可以访问Servlet原生方法)
基本上跟上一种使用方式差不多,使用 ServletActionContext或者实现 ServletXxxAware 接口。就是单词前多了一个Servlet。
这里比较详细的给出解耦的ActionContext方式访问:
public String execute() { //获取 ActionContext 对象 //ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息 ActionContext actionContext=ActionContext.getContext(); //1. 获取 application 对应的 Map Map<String,Object> applicationMap=actionContext.getApplication(); Object applicationValue=applicationMap.get("applicationKey2"); System.out.println("applicationValue"); applicationMap.put("applicationKey2", "ijinp"); //2. session Map<String,Object> sessionMap=actionContext.getSession(); Object sessionValue=sessionMap.get("sessionKey"); System.out.println("sessionValue"); sessionMap.put("sessionKey2", "guochangqing"); ///3. request* //ActionContext 中没有提供 getRequest 方法 //需要调用 get() 方法, 传入 request 字符串来获取. Map<String,Object> requestMap=(Map<String, Object>) actionContext.get("request"); Object requestValue=requestMap.get("requestKey"); System.out.println("requestValue"); requestMap.put("requestKey2", "liujishuai"); //4. 获取请求参数对应的 Map, 并获取指定的参数值. // 键: 请求参数的名字, 值: 请求参数的值对应的字符串数组 // 注意: 1. getParameters 的返回值为在 Map<String, Object>, 而不是 Map<String, String[]> // 2. parameters 这个 Map 只能读, 不能写入数据, 如果写入, 不出错, 但也不起作用! Map<String,Object> parameters=(Map<String, Object>) actionContext.getParameters(); String nameValue= (String) parameters.get("name"); return "success"; }
OK,今天就先写这些吧。。。