Struts2框架(一)架构、文件配置、核心API详解

来源:互联网 发布:flash傻瓜制作软件 编辑:程序博客网 时间:2024/06/01 07:26

Struts2框架(一)

介绍struts2

struts2:属于web层,代替servlet技术

strut2:接收并处理请求.

struts2:框架封装了很多web层开发中常见的功能,我们使用这些功能不需要我们增加来代码实现了,只需要配置下就直接使用.

struts2:提高web层开发效率

struct2与struct1框架

基于完全不同架构的不同的框架.并不属于版本的升级.

strut2框架搭建

1、导包,参考struts2下的apps/struts2-blank/web-inf/lib

2、创建Action(处理请求的servlet)

3、创建struts2主配置文件

在src下创建,名称struts.xml

<struts>    <package name="" namespace="" extends="">        <action name="" class="" method="">        <result class=""></resutlt>    </package></struts>

4、配置struts2入口过滤器

struts2架构

intercepter 拦截器 :请求经过action之前先经过拦截器

  1. 拦截器是用来封装功能,
  2. 体现AOP思想
  3. 可插拔式的灵活设计
  4. 早期版本默认经过18个拦截器,当前新版本默认经过20个拦截器

AOP思想:面向切面编程
纵向重复,横向抽取

struts2详解

基本配置信息

package元素:封装Action配置,方便项目的模块开发    name属性:给包起个名称,不能重复    namespace属性:命名空间,指定Action资源名前的访问路径        不写该属性,相当于填写"/",该属性值可以重复    extends属性:继承另一个包,会将配置信息继承,必须继承struts-default.action元素:配置action对象    name属性:指定访问action时填写的资源名称    class属性:填写Action完整类名,用于struts2框架创建action对象    method属性:定位类中处理请求的方法,填写方法名.result元素:定义结果    name属性:对应Action中方法的返回值    type属性:指定交给那个结果处理器来处理        转发(默认值) dispatcher        重定向 redirect    标签体:指定跳转的资源路径,相对目录WebContent<package name="hello" namespace="/hello" extends="struts-default">        <action name="HelloAction" class="cn.it.test.HelloAction" method="hello">            <result name="success" type="dispatcher">/hello.jsp</result>        </action>    </package>

常量配置

常量配置如何修改

  • src/struts.properties

  • src/struts.xml (推荐使用)

    <constant name="常量键" value="常量值"></constant>
  • WEB-INF/web.xml

    <init-param>    <param-name></param-name>    <param-value></param-value></init-param>

常量(列举3个)

struts.i18n.encoding=UTF-8 (国际化),解决表单post提交参数乱码

struts.action.extension=action 指定Action访问名后的后缀

struts.deMode=false 是否开启struts2开发模式(建议设置为true)
开启开发模式:1.热启动,方便配置文件生效 2.方便查看错误信息

<constant name="struts.devMode" value="ture"></constant>

动态方法调用配置

叹号动态方法调用

  1. 开启动态方法调用常量 struts.enable.DynamicMethodInvocation = true
  2. 删除method属性
  3. 在使用时使用Action名称!方法名[.后缀名]格式访问

    <constant name="struts.devMode" value="ture"></constant>        <action name="HelloAction" class="cn.it.test.HelloAction">

通配符动态方法调用

  1. Action元素的name属性改为使用*好通配符写法

  2. 浏览器中填写路径是,在访问路径中加入方法名

引入外部struts配置文件

<!-- 引入配置文件 -->    <include file="cn/it/dynamic/dynamic.xml"></include>

结果跳转

转发    <result name="success" type="dispatcher">/hello.jsp</result>重定向    <result name="success" type="redirect">/hello.jsp</result>转发到Action    <result name="success" type="chain">            <param name="namespace">/</param>            <param name="actionName">Demo2Action</param>    </result>重定向到Action    <result name="success" type="redirectAction">            <param name="namespace">/</param>            <param name="actionName">Demo3Action</param>    </result>

struts2中Action创建规则

action创建方式1:Action可以是一个pojo(普通java对象-不需要实现任何接口|继承任何类)
struts2是一款代码低侵入性框架

创建方式2:实现一个名为Action的接口
1. 准备Action方法例子供我们参考
2. 准备了字符串常量供我们使用

Action中方法规则:
1. public
2. String
3. 方法名任意
4. 方法不能有参数
5. 方法可以抛出异常

创建方式方式3:继承一个名为ActionSupport类
1.ActionSupport实现了Action接口,我们可以使用接口中的方法和常量,方法也不需要空实现
2.还实现了Validateable, ValidationAware, TextProvider, LocaleProvider接口,可以直接使用这些接口的功能.

struts2中如何获得ServletAPI

ActionContext对象

  1. ActionContext的生命周期?
    每次请求都会创建一个ActionContext
  2. ActionContext本质是什么?
    本质是Map集合
  3. ActionContext应如何获得?
    struts2使用ThreadLocal将数据中心与当前请求的线程绑定,我们可以随时获得请求线程绑定的数据中心对象.

获得方式

解耦方式

/** *  解耦方式访问ServletAPI *  获得request、session、application域的Map */public class Demo9 extends ActionSupport{    public String execute() throws Exception {        //获得数据中心-ActionContext对象        ActionContext context = ActionContext.getContext();        //appication域Map        Map<String, Object> applicationScope = context.getApplication();        //session域Map        Map<String, Object> sessionScope = context.getSession();        //request域Map        Map<String,Object> request = (Map<String, Object>) context.get("request");        //struts2推荐使用ActionContext本身作为request域        //分别向三个域中存入键值对        applicationScope.put("name", "applicationTest");        sessionScope.put("name", "sessionTest");        context.put("name", "requestTest");        return SUCCESS;    }}

原生API方式

/** *  获得原生ServletAPI *  获得原生request、session、ServletContext */public class Demo10 extends ActionSupport{    @Override       public String execute() throws Exception {        //获得原生request        HttpServletRequest request = ServletActionContext.getRequest();        //获得原生response        HttpServletResponse response = ServletActionContext.getResponse();        //获得原生session        HttpSession session = request.getSession();        //获得原生servletContext        ServletContext servletContext = ServletActionContext.getServletContext();        //向域中存放值        request.setAttribute("name", "requestTest");        session.setAttribute("name", "sessionTeset");        servletContext.setAttribute("name", "servletContextTest");        return SUCCESS;    }}

实现接口方式

/** *  实现接口方式获得ServletAPI */public class Demo11 extends ActionSupport implements ServletRequestAware{    //实现接口,并准备成员变量接收对象          private HttpServletRequest request;    @Override       public String execute() throws Exception {        //向域中存放值        request.setAttribute("name", "requestDemo");        return SUCCESS;    }    //在接口实现方法中保存传入对象    @Override    public void setServletRequest(HttpServletRequest request) {        this.request = request;    }}
0 0