struts2 基本用法1

Struts2的核心功能

允许 POJO 对象作为 Action

Action 的execute方法不再与 Servlet API耦合,更容易测试 

支持更多视图技术(JSP,FreeMarker,Velocity)

基于Spring AOP的思想的拦截器机制,更容易扩展

更强大,更易用输入校验功能

整合Ajax支持等等

 

Struts2 的目录结构 

像 apps: 该文件夹包含了基于struts2的示例应用,这些示例应用对于学习是非常有用的

docs: 该文件夹下包含了struts2相关文档,包括struts2快速入门,struts2的文档以及API文档等

lib:该文件夹下包含了Struts2框架和核心类库,以及struts2的第三方插件类库

src: 该文件夹下包含了Struts2框架的全部源代码

struts2的语法提示: Eclipse支持struts.xml语法提示

  通过联网的方式或者手动配置DTD路径都可以

 

Struts2的简单执行流程:

  客户端和服务端 

  客户端向服务端发起请求request  /crm/hello.action 

  服务端解析请求,找到对应的action元素  

  前端控制器 StrutsPrepareAndExecuteFilter和struts.xml文件(包含具体的action的配置)

  把前端控制器配置在web.xml中,通过  HelloAction与Model之间相互  向前端控制器返回逻辑视图和名称  然后转发到物理视图 最后把 视图 response到客户端

 

配置文件中的常量配置:

<include file="struts-part1.xml">

在大部分的应用中,随着应用的增加,系统中Action看的数量也会大量增加,导致struts.xml文件会变得非常的臃肿. 那么为了避免这样的问题,而提高struts.xml文件的可读性,我们可以将一个struts.xml的配置文件分解为多个配置文件,然后在struts.xml文件中包含其他的配置文件 

比如说:

<struts>
    <include file="struts1.xml"/>
    <include file="struts2.xml"/>
</struts>

 

常见的常量的配置

指定默认的编码集,作用于HttpServletRequest的setCharacterEncoding方法和freemarker,velocity的输出

<constant name ="struts.i18n.encoding" value="UTF-8" />

该属性指定需要struts2处理的请求后缀,该属性的默认值是action,即所有匹配*.action的请求都由struts2处理.

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号隔开

<constant name="struts.action.extension" value="action" />

设置浏览器是否缓存静态内容,默认值为true(生产环境下使用)开发阶段建议关闭

<constant name="struts.serve.static.browserCache" value="false" />

当struts的配置文件修改后,系统是否自动重新加载文件,默认值为false,开发阶段建议打开

<constant name="struts.configuration.xml.reload" value="true" />

默认的视图主题 

<constant name="struts.ui.theme" value="xhtml"/>

 

package,action,result配置 : 

package元素: 

<package> 元素: 是<struts>根元素的子元素

<package name="" extends="" namespace="" abstract="" ></package>

用来对多个<action>元素分类管理,和java中的package没有关系

常见的属性: 

name: 表示<package>的名字,但是要保证不同package包下的name不同,可以通过该名字被其他的包所指代.

extends: 表示当前的package继承的是哪一个package,一般都是struts-default

  继承struts-default之后,就拥有了该package定义的所有资源(结果返回类型,拦截器)

namespace表示命名空间,一般以/打头

abstract: 抽象的.缺省值是false,若一个package的abstract="true" 那么该package中就不能再定义action元素,只能用来继承.

<action>元素:是<package>元素的子元素.
      专门用来配置Action对象/Action类的,理论上一个Action类匹配一个<action>元素.
<action name="" class="" method=""/>
常见的属性:
name: action的名称,在同一个<package>中,action的名字必须唯一. 和<package>的namespace共同决定了一个Action类的访问路径.
      注意:action的name值不能以"/"打头.
class:一个Action类的全限定名.    缺省值:com.opensymphony.xwork2.ActionSupport类.

method:当前Action动作访问的方法, 缺省值:execute.

<result>元素:配置结果视图.
<result name="" type="">   </result>
局部结果视图: <result>定义在<action>中,只能是当前action跳转的结果视图.
全局结果视图: <result>定义在<global-results>中,而<global-results>在<package>中,当前<package>中所有的action都可以跳转的结果视图.


寻找规则:先找局部结果视图,找到就跳转,找不到再找全局结果视图,找到跳转,找不到报错.
----------------------------------
常见的属性:
name:Action方法返回的逻辑视图名称. 缺省值:success.
type:结果的跳转类型.该类型的值在struts-default.xml中已经预定义好了. 缺省值:dispatcher.
常见的type值(结果类型):
dispatcher:      表示从Action请求转发到页面(JSP).
redirect:          表示从Action重定向到页面(JSP).
chain:               表示从Action请求转发到另一个Action.
redirectAction:  表示从Action重定向到另一个Action.
stream:          表示返回流. 文件下载时使用.

Action类的三种编写方式:
第一种.使用公共的POJO类作为Action. 提供公共的无参数的Action方法.(不推荐).
缺点:
    没有一种方式约束Action方法必须是公共的无参数的.
    Action方法的返回逻辑视图名可以自定指定. 有时起名不规范. 比如:"ooxx".


解决方案:第二种.
第二种.定义一个类,实现于com.opensymphony.xwork2.Action接口.并覆写execute方法即可.(不推荐)
Action接口中,不仅提供了Action方法的声明,也提供了常用的逻辑视图名称:
public static final String SUCCESS = "success";
public static final String NONE = "none";
public static final String ERROR = "error";
public static final String INPUT = "input";
public static final String LOGIN = "login";
缺点:
    不支持国际化,数据校验,消息机制.
解决方案:第三种:


第三种.定义一个类,继承于com.opensymphony.xwork2.ActionSupport类.(推荐)
public class ActionSupport implements Action, Validateable, ValidationAware, TextProvider, LocaleProvider, Serializable {}
---------------------------------------------
真实开发中,我们却往往再提供一个BaseAction类.
ActionSupport.
---BaseAction(自定义Action的基类.)
-----AAction

-----BAction

struts2中访问servletApi的三种方式:

Action访问Servlet API,有三种方式:
1.通过让Action类去实现感知接口.
2.使用ServletActionContext类,该类提供很多静态方法可以返回Servelet API对象(比如需要操作Cookie).
3.使用ActionContext类,本身是Struts2对Servlet API的封装.(建议和优先选用)

方式1:通过让Action类去实现感知接口.也就是实现这三个接口,然年拦截器操作属性来注入对应的对象
此时项目依赖:servlet-api.jar.

ServletRequestAware:感知HttpServletRequest对象;
ServletResponseAware:感知HttpServletResponse对象;
ServletSessionAware:感知HttpSession对象;
---------------------

方式2.使用ServletActionContext类,该类提供很多静态方法可以返回Servelet API对象.该方式更为简单,直接通过ServletActionContext中的静态方法返回对应的对象


可以这样来理解,ServletActionContext就是Servlet API的工具类.
使用的非常频繁,因为简单易用.

static HttpServletRequest getRequest() :返回HttpServletRequest对象
static HttpServletResponse getResponse() :返回HttpServletResponse对象
static ServletContext getServletContext()  :返回ServletContext对象.
---------------------

方式3.使用ActionContext类,本身是Struts2对Servlet API的封装.成一个map对象

什么是ActionContext: Action的环境对象,每一次请求都是一个新的Action对象,一个ActionContext对象封装了这一次请求的相关数据.
ActionContext使用了ThreadLocal模式,所以说是线程安全的.
创建ActionContext对象:
      ActionContext  ctx = ActionContext.getContext();
---------------------------------------------------------------------------------
ActionContext的常用方法:
             此时把作用域对象全部使用Map来表示.
获取请求参数:
以前:  String  request.getParameter(String name);
            String[]  request.getParameterValues(String name);
现在:
             Map<String,String[]> getParameters();


操作request作用域对象:
以前:  
                  设置共享数据:request.setAttribute(String name,Object value);
                  获取共享数据:Object value  = request.getAttribute(String name);
现在:        ActionContext本身就是对一次请求的封装.
                  设置共享数据:ActionContext.getContext().put(String name,Object value);
                  获取共享数据:Object vale = ActionContext.getContext().get(String name)


操作session作用域对象:
以前:
                   设置共享数据:request.getSession().setAttribute(String name,Object value);
                   获取共享数据:Object value  = request.getSession().getAttribute(String name);
现在:         只需要得到Session的Map对象即可.
                   Map<String,Object> sessionMap = ActionContext.getContext().getSession();
                   设置共享数据:sessionMap .put(String name,Object value)
                   获取共享数据:Object value = sessionMap .get(String name)
操作application作用域对象:
以前:
                   设置共享数据:request.getServletContext().setAttribute(String name,Object value);
                   获取共享数据:Object value  = request.getgetServletContext().getAttribute(String name);
现在:         只需要得到application的Map对象即可.
                    Map<String,Object> applicationMap = ActionContext.getContext().getApplication();
                    接下来的操作就是操作Map.
什么是ActionContext: Action的环境对象,每一次请求都是一个新的Action对象,一个ActionContext对象封装了这一次请求的相关数据.
ActionContext使用了ThreadLocal模式,所以说是线程安全的.
创建ActionContext对象:
      ActionContext  ctx = ActionContext.getContext();
---------------------------------------------------------------------------------
ActionContext的常用方法:
             此时把作用域对象全部使用Map来表示.
获取请求参数:
以前:  String  request.getParameter(String name);
            String[]  request.getParameterValues(String name);
现在:
             Map<String,String[]> getParameters();
----------------------------------------------------------------------------------

 

Action获取请求参数的三种方式:

Action获取请求参数三种方式:

第一种:Action本身作为Model对象,通过setter方法封装(属性注入)

Struts2接受参数,拥有类型转换器,支持自动类型(可以把String类型转换为int类型).
方式1很简单,但是如果表单参数很多,就得提供很多字段和setter方法.
期待第二种方式.
第二种:创建独立Model对象,页面通过ognl表达式封装(属性注入)

第三种:使用ModelDriven接口,对请求数据进行封装(模型驱动)

posted @ 2019-07-02 09:58  xiejiachen  阅读(174)  评论(0)    收藏  举报