2.action的配置、常量配置以及路径的配置

来源:互联网 发布:sql 超出日期范围 编辑:程序博客网 时间:2024/05/01 16:38
一、Action类的作用:接收和传递数据,调用逻辑。业务处理调度。
       接收客户端的请求参数数据,调用业务逻辑类处理逻辑,返回结果码(响应资源的逻辑名-->资源的真实路径)。
  1) Struts2中最简单的要求就是你的Action类中要提供一个默认的请求处理方法,这个方法的签名如下:
     public String execute() throws Exception{ ....}
  2) 在实际应用中,为了方便使用,一般都会实现Action接口或继承自ActionSupport类。

二、Struts2中的配置文件:约定大于配置
★1) struts.xml: 核心配置文件,Action映射、Result映射、拦截器、常量等
            开发人员经常编辑的配置文件。
  2) struts.properties    常量属性配置文件,改变框架的行为。这个配置文件中的常量配置可以配置在struts.xml文件中。
     Struts2内置了默认的常量配置文件:default.properties
  3) struts-default.xml    在core包下自带的基础配置文件,为框架提供默认设置。此文件会自动包含到struts.xml中。  
  4) struts-plugin.xml    给struts2框架添加插件的配置文件。

三、struts2.xml中常量的配置
struts.i18n.encoding=UTF-8:请求消息体的编码方式
★struts.action.extension=action:指定被struts2处理的请求后缀类型。多个用逗号隔开。如:action,do,go,htm
★struts.configuration.xml.reload=false:当struts.xml改动后,是否重新加载。默认值为false(生产环境下使用),开发阶段最好打开
★struts.devMode=false:是否使用struts的开发模式。开发模式会有更多的调试信息。默认值为false(生产环境下使用),开发阶段最好打开
★struts.serve.static.browserCache=true:设置浏览器是否缓存静态内容。默认值为true(生产环境下使用),开发阶段最好关闭。
★struts.objectFactory=spring:指定由spring负责action对象的创建
struts.enable.SlashesInActionNames=false:启用Action的name是否支持斜线(/)。不建议使用
struts.enable.DynamicMethodInvocation=true:启用动态方法调用
struts.ui.theme=simple:UI主题类型

四、struts.xml中包的配置: struts.xml文件中使用包(package)来管理Action、Result、拦截器、拦截器栈等配置信息。
<package>常用属性
1) name:包名,作为被其它包引用的标识。必须的。
        实际应用中,应该把一组业务功能相关的Action放在同一个包下。
2) extends:指定要扩展的包名。
一般会继承自struts-default包。struts-default包是struts2内置的,它定义了struts2内部的众多拦截器和Result类型。
3) namespace:指定名称空间。Struts2中Action的请求URI映射由namespace和action名称两部分组成。
如果不指定该属性,默认的命名空间为""(空字符串)。
4) abstract:声明包为抽象的。抽象包中不能配置action,只能用于被继承。

五、struts.xml中action的配置
1. name: 指定action的名称。其实就是用于匹配请求的URL路径。默认情况下不能使用“/”
2. class: 指定处理这个请求的Action类的全限定名
3. method: 指定处理这个请求的Action类的方法名。如果不配置这个属性,默认使用execute方法
4. converter: 指定Action类使用的类型转换器的全限定名。很少使用

六、Struts2应用中请求URL的搜索顺序:Struts2中请求URL的匹配是由namespace+“/”+name组合而成的。
例如有这样一个url:http://server:port/appName/path1/path2/path3/test.action

1. 首先寻找namespace为“/path1/path2/path3”的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package则转步骤2;
2. 寻找namespace为“/path1/path2”的package,如果存在这个package,则在这个package中寻找名字为test的action,如果不存在这个package,则转步骤3;
3. 寻找namespace为“/path1”的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,则转步骤4;
4. 寻找namespace为“/”的package,如果存在这个package,则在这个package中寻找名字为test的action,如果仍然不存在这个package,则转步骤5;
5. 在默认的namespace的package下找名字为test的action,如果还是找不到,页面提示找不到action。

★★★★★注意:当设置struts.enable.SlashesInActionNames=true时,一定会通过namespace组合action的name来做完全匹配。
所以,个人不建议在action的name值中启用/。。。。


七、 一个Action中多个请求处理方法(类似于struts1中的DispatcherAction的功能)
 1) 每个请求配置一个Action,并指定请求处理的方法:
    <action name="user_list" class="...UserAction" method="list">...
    <action name="user_add" class="...UserAction" method="add">...
 2) 使用通配符针对同一类型的请求配置一个Action
    <action name="user_*" class="...UserAction" method="{1}">...
★3) 使用动态方法调用:配置启用动态方法调用struts.enable.DynamicMethodInvocation=true
    <action name="user" class="...UserAction">...</action>
            请求路径方式:user!list.action--->执行UserAction中的list方法
               user!add.action--->执行UserAction中的add方法
 4) 其实使用通配符和动态方法这两种方式会存在一些安全漏洞。。。
 
八、 请求数据封装到Action(JSP-->Action): 客户端请求中提交的参数数据是通过Struts2内置的一个叫ParametersInterceptor的拦截器来完成自动封装到Action中的。
 1) Field-Driven属性驱动方式:在Action中定义与客户端请求中的参数同名的属性并提供Getters和Setters方法。
 2) Model-Driven模型驱动方式:客户端请求中的参数数据封装到Action中的某个对象的属性中。(需要ModelDrivenInterceptor拦截器的支持)。
 JSP: acc.lname=张三 --> ParameterInterceptor -->OGNL来解析参数名-->数据类型转换-->传递值  --> Action: user(lname)
      user.id     -->         user(id)
      id          -->         id;

九. Action传递数据到下一个资源(Action-->JSP):
 0) ActionContext:代表当前Action执行的上下文。Action实例所操作到的数据都可以往ActionContext中存放,可以从中取。
    ActionContext的实例是绑定到当前线程(ThreadLocal)上,也不用考虑线程安全问题。。。
    获取ActionContext的实例的方法: ActionContext context = ActionContext.getContext();
    
 1) 使用ActionContext提供的三个Map用于代表request/session/application三个属性作用域:
    a) actionContext.put("key", Object value);  --> 相当于request.setAttribute("key", Object value);
    b) actionContext.getSession().put("key", Object value); --> session.setAttribute("key", Object value);
    c) actionContext.getApplication().put("key", Object value); --> servletContext.setAttribute("key", Object value);
 
 2) 直接使用ServletAPI:struts2也提供了一个叫ServletActionContext的实例,用于获取Servlet中的Request,Response, Session, ServletContext实例
    HttpServletRequest servletActionContext.getRequest();
    ServletContext servletActionContext.getServletContext();
    
十、 Result的配置:代表Action执行后的结果。
 1) Struts2提供了多种Result类型的实现:
    ★a) ServletDispatcherResult:servlet请求分派。默认使用
   ★b) ServletRedirectResult:servlet重定向。
    c) ServletActionRedirectResult:重定向到另一个Action映射
    d) FreemarkerResult:用FreeMarker模板引擎呈现视图
    
 2) <result>标签的配置属性:
    a) name: 指定Result的逻辑名。不指定时,默认就是"success"
    b) type:指定Result的类型。可选值: dispatcher(请求分派,默认值)、redirect(重定向)、redirectAction(重定向到另一个Action)、freemarker(使用Freemarker呈现视图)
    c) 标签的主体内容:就是资源的真实路径名。建议使用绝对路径。
 3) 局部Result和包内全局Result:
    a) 作为<Action>标签的子标签时:局部的。优先级高
    b) 作为<global-results>标签的子标签时:包内全局的。

 4) 在Result中配置参数:<result name="xxx">/xxx.jsp?id=${id}</result>

     此时在action 的类中需要有id的set和get方法,在相应的方法中对id赋值即可

    id的值会使用OGNL中ActionContext中自动获取。

十一、 异常的处理:Struts2通过拦截器(ExceptionMappingInterceptor)对Action抛出的异常进行捕获。
在struts.xml文件中使用<exception-mapping>标记来配置

十二、 为一个Struts2应用配置多个配置文件:
   在struts.xml可以通过<include>标签来包含子配置文件。方便团队开发。
   


0 0
原创粉丝点击