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接口,对请求数据进行封装(模型驱动)

浙公网安备 33010602011771号