Struts2

struts2介绍

概括
    struts2是J2EE的比较流行的框架,对JSP/servlet进行了封装,应用于面向WEB开发的项目。
    struts是MVC设计模式的一种解决方案
    Struts2是基于MVC的Web应用框架
    Struts2=Struts1的知名度和市场+WebWork的技术
        实现MVC模式,结构清晰
        丰富的标签(tag)
        通过配置文件页面导航,便于后期维护
        与Servlet API松耦合,便于测试
下载
    http://struts.apache.org   
        Projects -- > struts
    http://archive.apache.org/dist/struts/binaries/
功能介绍
    数据输入校验。
    Struts标签用于页面开发。
    可扩展性编程。
    采用拦截器实现AOP功能。
    国际化和本地化。
    文件上传下载。
    表单重复提交校验
struts2和struts1的区别
    1)Action实现:struts1继承抽象的父类,struts2不需要。
    2)Action实例化:struts1中Action是单例模式,Struts2为每一个请求创建一个Action实例。
    3)与jsp/Servlet耦合:struts1在调用传统的jsp/servletAPI,但struts2可以调用jsp/servlet的API(不推荐),但重新封装了其他的API(与jsp/servlet无关),实现解耦。
    4)测试方面:因为Struts1仍然调用servlet的API,因此测试必须依赖于web服务器,但Struts2克通过实例化,方法调用的方式测试。
    5)表达式语言:struts1整合了JSTL,struts2则整合了 更为强大的OGNL表达式。
    6)struts2与struts1除了命名之外,其实没有多大关系。
目录结构
    apps:基于Struts2的示例应用
    docs:Struts2开发的各类帮助文档
    lib:核心类库及第三方插件类库
    requied-lib:Struts 2开发常用的jar文件
    src:Struts2框架的源代码

使用

1.导入jar包
    struts2-core-2.3.4.1.jar    Struts2的核心包
    xwork-core-2.3.4.1.jar  xwork的核心包
    commons-io-2.0.1.jar    支持IO读写操作
    commons-fileupload-1.2.2.jar    支持文件的上传和下载
    ognl-3.0.5.jar  支持OGNL表达式
    freemarker-2.3.19.jar   基于模板生成文本输出的通用工具/标签库模板包
    javassist-3.11.0.GA.jar 支持JAVA字节码操作
    commons-lang3-3.1.jar 对java.lang包扩展
2.配置struts2的核心过滤器
    在web.xml中配置
    
        struts2
        
        org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
    
    
        struts2
        
        /*
    
3.truts2的配置文件
    在src目录下
    默认struts.xml
4.编写Action
5.在struts配置文件中配置action

Action

作用
    处理请求
    实现业务逻辑
    返回result决定结果视图
实现方式
    1.普通的Java类
    2.实现Action接口
    3.继承ActionSupport类
普通的Java类
    public class OneAction{
        public String execute() throws Exception {
            System.out.println("访问到了");
            //返回的字符串  对应 result的name属性
            return "success";
        }
    }
实现Action接口
    public class OneAction implements Action{
        @Override
        public String execute() throws Exception {
            System.out.println("访问到了");
            //返回的字符串  对应 result的name属性
            return "success";
        }
    }
继承ActionSupport类
    public class OneAction extends ActionSupport{
        private static final long serialVersionUID = 2245233853322624873L;
        //action中默认调用的方法就是execute方法
        @Override
        public String execute() throws Exception {
            System.out.println("访问到了");
            //返回的字符串  对应 result的name属性
            return "success";
        }
    }
配置
    
        /info.jsp
    

Struts配置文件

基础配置
    这个配置文件需要到struts的源码中去搜索,随便一个就可以。
    
    
    
    
内容
    
        
            
        
    
说明
    package
        说明
            包,管理action的路径
        name
            包名
            作用:给其它包去继承
            注意:包名必须要唯一,否则启动会报错
        namespace 
            命名空间
            可以对路径进行管理
            是url的一部分 
            默认是/
            如果是 /test 访问路径 = /test/actionName
        extends
            继承
            自定义的包,必须要继承 struts-default
            struts-default.xml
                文件目录 struts2-core-xxx.jar/struts-default.xml
                result-types : 返回值类型
                interceptors : 拦截器
        abstract
            默认是false,如果是true表示是一个抽象包,即里面不能有action的定义。
    action
        说明
            是一个控制器
            作用:配置访问路径与处理action的映射关系
        name
            访问路径
            控制器的名称,是url的一部分
        class
            控制器实际路径
            访问路径对应action类的全名 可以不写 默认是ActionSupport
            默认的class写法用来做页面跳转
                WebContent目录下是 /hello.jsp
                WEB-INF目录下是 /WEB-INF/hello.jsp
                默认的class在 struts-default.xml中配置了 
            修改默认执行的Action类   一般不会做修改
                
        method
            执行的方法,默认是execute
            可以省略不写
    result
        说明
            是结果集
            配置action中处理请求的方法,返回的结果视图标记对应的跳转资源
        name
            是结果的名称,通过action动作的返回值来指定。
            action处理方法的返回值
        文本值
            是结果视图
        type
            设置结果视图的类型和跳转方式
            转发 : dispatcher  默认
            重定向 : redirect
            这两个值都在struts-default.xml 中result-types中有定义

struts2访问过程

http://localhost:8080/struts2/test/six1
    1.先找struts.xml配置文件
    2.在配置文件中找命名空间/test 注意:这个地方会按照层级去找 
        /a/b/c/six 查找机制 
            首先在/a/b/c/中找six
            然后在/a/b/中找six
            然后再/a/中找six
            然后再/中找six
            如果没有就报错
    3.在命名空间中找action的six1
    4.执行action中的方法
    5.在配置文件中找result返回值
    6.找到页面进行返回

Action细节

struts2的加载顺序
    default.properties --> struts-default.xml --> struts.xml ---> *.xml
其它注意
    每次访问action的内存地址都是会改变的
    action是多例的
    servlet,filter,listener是单例的
    struts1中的action是单例的

请求参数封装

属性方式 public class OneAction{ //普通属性方式 private String name; //对象属性方式 private Student student; public String execute() throws Exception { return "success"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Student getStudent() { return student; } public void setStudent(Student student) { this.student = student; } } 对象方式 public class UserAction{ private Student student; public String execute() throws Exception { System.out.println("user-action"); System.out.println(student); return "success"; } public void setStudent(Student student){ this.student = student; } public Student getStudent(){ return this.student; } } ModelDriven方式 public class UserAction implements ModelDriven{ private Student student = new Student(); public String execute() throws Exception { System.out.println("user-action"); System.out.println(student); return "success"; } @Override public Student getModel() { return student; } }

通配符

与后边的{1}是对应关系
    eight_* 中 {1}代表这个*
    eight_*_* 中{2}代表第二个*

    
    /{1}.jsp

按模块拆分struts.xml

struts-article.xml
    
        
             /article.jsp
        
    
struts-user.xml
    
        
             /user.jsp
        
    
struts.xml
    
        
        
        
    

访问Servlet API(Request/Session/Application)的方式

第一种方式
    ActionContext context = ActionContext.getContext();
    //保存到request域
    Map request = (Map)context.get("request");
    request.put("request_data", "request_data_message");
    //保存到session域
    Map session = (Map)context.get("session");
    session.put("session_data", "session_data_message");
    //保存到application域
    Map application = (Map)context.get("application");
    application.put("application_data", "application_data_message");
第二种方式-有耦合
    //保存到request域
    HttpServletRequest request = ServletActionContext.getRequest();
    request.setAttribute("request_data", "request_data_message");
    //保存到session域
    HttpSession session = request.getSession();
    session.setAttribute("session_data", "session_data_message");
    //保存到application域
    ServletContext context = ServletActionContext.getServletContext();
    context.setAttribute("application_data", "application_data_message");
第三种方式
    public class ElevenAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
        private Map application;
        private Map session;
        private Map request;
        @Override
        public void setRequest(Map request) {
            this.request = request;
        }
        @Override
        public void setSession(Map session) {
            this.session = session;
        }
        @Override
        public void setApplication(Map application) {
            this.application = application;
        }
    }

乱码问题

POST方式GBK编码
    项目统一编码GBK
    
POST方式UTF-8编码
    项目统一编码UTF-8
    
POST方式其它
    项目统一编码GBK
    
GET方法UTF-8编码
    项目统一编码UTF-8
    
    tomcat/conf/server.xml配置

常量修改

概述
    在struts2-core 里面 的 org.apache.struts2包下来 default.properties 这里面有常量配置
修改
    
名称
    struts.i18n.encoding=UTF-8 
        请求数据的中文处理 请求数据的编码 POST请求
    struts.action.extension=action,, 
        访问后缀
    struts.enable.DynamicMethodInvocation = true 
        是否开启动态方法调用,就是是否可以通过*号的方式来指代占位
        http://localhost:8080/struts2/twelve1!insert 这种访问方式是否可以
    struts.multipart.maxSize=2097152 
        文件上传大小的限制
        默认是2M
    struts.devMode = false 
        开发者模式,会显示更多的日志信息
    struts.i18n.reload=false 
        就是改了配置文件是否需要重启服务
    struts.ui.theme=xhtml 
        修改struts主题 ,一般都改为simple,就是jsp页面使用struts标签的时候,
        页面展示的时候,生成是html页面是否有额外的东西。

result结果集的type类型11个类型

转发
    /user.jsp
重定向 - 外部资源
    /one.jsp
    /user/one

配置错误页面

某个Action下的错误页面
    
         /error.jsp
    
全局错误页面
    
        error.jsp
    
全局未抓取的异常配置
    
        
    

struts-tags 标签

需要导入taglib指令:
    <%@taglib uri="/struts-tags" prefix="s"%>
标签分类
    通用标签
        数据标签
        控制标签(默认前缀s)
    UI标签
    Ajax标签(默认前缀sx)
数据标签
    提供对各种数据访的相关功能
    
        输出值栈及Stack Context 中所有能访问的值
        访问对象的属性
        //value 是Action中的userName属性
        
        //value 是Action中的user属性对象中的userName属性
        
        Action的成员变量存储在值栈中
            
        访问List集合的一个元素
            
        访问List集合的第一个元素的属性
             
        获取List集合的大小
             
        获取List集合是否为空
             
    
        在页面上生成一个链接,单击这个链接可以
        查看值栈及Stack Context 中所有能访问的值
        
        格式化输出一个日期
     
        对设置的表达式求值,并将结果赋给特定作用域的某个变量
     
        生成一个URL 地址
       
        生成HTML 的标签
       
        为其他标签添加参数化设置
     
        把其他页面包含到当前的页面上
控制标签
    用来完成流程控制,如分支流程、循环流程等
    //   
        实现分支流程控制,它们的语意和Java中的if、else if、else相似
        
        主要用于对集合实现循环访问功能
UI标签
    用来生成UI界面及元素
        
        对应HTML 中的
,用于向服务器端提交数据 对应HTML 中的,即单行文本框 对应HTML 中的