zoukankan      html  css  js  c++  java
  • Struts框架的核心业务

    Struts的核心业务

    Struts核心业务有很多,这里主要介绍了比较简单一些的:
    请求数据的处理,和数据自动封装,类型自动转换

    1.Struts中数据处理

    1.1.方式1:直接过去servletapi

    核心类:ServletActionContext提供的静态方法

    /**
     *
     * 数据处理方式1:
     */
    public class dataAction extends ActionSupport{
        public String execute() throws Exception {
            //1.请求数据处理
            //2.调用Service处理业务逻辑,拿到结果数据
            //3.保存数据到域中
            //Struts中对数据操作,方式1:直接拿到ServletApi,执行操作
            HttpServletRequest request = ServletActionContext.getRequest();
            HttpSession session = request.getSession();
            ServletContext application = ServletActionContext.getServletContext();
            //操作
            request.setAttribute("request_data","request_data_value");
            session.setAttribute("session_data","session_data_value");
            application.setAttribute("application_data","application_data_value");
    
            return SUCCESS;
        }
    }
    

    1.2.方式2:通过ActionContext获取

    可以通过ActionContext获取不同(代表request/session/application)的map

    
    /**
     *
     * 数据处理方式2:
     */
    public class dataAction extends ActionSupport{
        public String execute() throws Exception {
            //1.请求数据处理
            //2.调用Service处理业务逻辑,拿到结果数据
            //3.保存数据到域中
    
            //下面的方法不用导入servlet的包,推荐使用,但是这种方式只能保存,如果设计其他操作还是需要用上面的方法
            //Struts中对数据的操作,方式2:通过ActionContext类
            ActionContext ac = ActionContext.getContext();
            //得到Struts对HttpServletRequest对象进行了封装,封装为一个map
            //拿到表示request对象的map
            Map request = ac.getContextMap();
            //拿到表示Session对象的map
            Map session = ac.getSession();
            //拿到表示servlectContext对象的map
            Map application = ac.getApplication();
    
            //数据
            request.put("request_data","request_data_value");
            session.put("session_data","session_data_value");
            application.put("application_data","application_data_value");
    
    
            return SUCCESS;
        }
    }
    

    1.3.方式3:实现接口的方式(RequestAware/SessionAware/ApplicationAware)**

    
    /**
     * 数据处理方式3:
     */
    public class dataAction2 extends ActionSupport implements RequestAware,SessionAware,ApplicationAware {
        private Map<String,Object> request;
        private Map<String,Object> session;
        private Map<String,Object> application;
    
    
        //struts运行时候,会把代表request的map对象注入
        public void setRequest(Map<String, Object> request) {
            this.request=request;
    
        }
        public void setSession(Map<String, Object> session) {
            this.session=session;
        }
        public void setApplication(Map<String, Object> application) {
            this.application = application;
        }
        @Override
        public String execute() throws Exception {
            //数据
            request.put("request_data","request_data_value");
            session.put("session_data","session_data_value");
            application.put("application_data","application_data_value");
    
    
            return SUCCESS;
        }
    
    }
    
    

    三种方式的区别:
    第一种方式需要再导入servlet,依赖性较大,只有还会使用到request等类型其他方式的时候才会用
    第二种比较常用,推荐使用这种
    第三种是需要写很多的方法,只有在方法比较多的时候,才会使用,即大型的项目中才会考虑使用。但是一般都是使用第二种

    2.请求数据自动封装

    2.1.基本思想和简介

    在Struts框架之前,表单内的数据参数会被Servlet接收,然后存入实体bean类里面。那么有了Struts框架之后,这个操作就由框架来自动完成了。
    表单提交的参数保存分为基本类型的和对象属性的:
    如果是基本类型和Date类型的,只需要对该类型再写一个set××()方法就可以,可以不写get××()方法。
    如果是对象类型,然后把数据保存到对象的属性中,就需要在bean中写set**()和get××()方法,然后在action中也需要写set××()和get××(),但是不用new方法来创建对象,直接定义一个对象就可以了(private User user;)

    实现原理是通过参数拦截器来实现的:
    <interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

    2.2.基本数据类型和Date

    jsp表单页面

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>index</title>
      </head>
      <body>
      <form action="${pageContext.request.contextPath}/login1" method="post">
        用户名:<input type="text" name="name"> <br/>
        密码:<input type="text" name="pwd"> <br/>
        年龄:<input type="text" name="age"> <br/>
        生日:<input type="text" name="birth"> <br/>
    
        <input type="submit" value="注册">
      </form>
      </body>
    </html>
    
    

    action处理页面

    package d_action;
    
    
    
    import com.opensymphony.xwork2.ActionSupport;
    
    import java.util.Date;
    
    /**
     *Struts核心业务,请求数据自动封装,以及类型转换
     */
    public class UserAction extends ActionSupport{
    
        //封装请求数据
        private String name; //必须给set,get可以不用给
        private String pwd;
        private int age;
        private Date birth;
    
        public void setName(String name) {
            this.name = name;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    
    
        //处理注册请求
        public String register(){
            System.out.println(name);
            System.out.println(pwd);
            System.out.println(age);
            System.out.println(birth);
            return "success";
        }
    }
    
    

    2.3.自动转换对象属性

    jsp页面

    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>index</title>
      </head>
      <body>
      <form action="${pageContext.request.contextPath}/login1" method="post">
        用户名:<input type="text" name="user.name"> <br/>
        密码:<input type="text" name="user.pwd"> <br/>
        年龄:<input type="text" name="user.age"> <br/>
        生日:<input type="text" name="user.birth"> <br/>
    
        <input type="submit" value="注册">
      </form>
      </body>
    </html>
    
    

    action类:

    package d_action;
    
    
    
    import com.opensymphony.xwork2.ActionSupport;
    
    
    /**
     *Struts核心业务,请求数据自动封装,对象的属性
     */
    public class UserAction extends ActionSupport{
    
        //封装请求数据
        private User user;  //对象类型一定要给get方法
    
    
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        //处理注册请求
        public String register(){
            System.out.println(user.getName());
            System.out.println(user.getPwd());
            System.out.println(user.getAge());
            System.out.println(user.getBirth());
            return "success";
        }
    }
    
    

    调用的User实体:

    package d_action;
    
    import java.util.Date;
    
    
    public class User {
        private String name; //必须给set,get可以不用给
        private String pwd;
        private int age;
        private Date birth;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getPwd() {
            return pwd;
        }
    
        public void setPwd(String pwd) {
            this.pwd = pwd;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public Date getBirth() {
            return birth;
        }
    
        public void setBirth(Date birth) {
            this.birth = birth;
        }
    }
    
    

    3.类型转换

    3.1.为什么需要类型转换

    Struts中jsp提交的数据是String,代码中使用或再显示,就需要转换为对应的格式,Struts会自动转换为action中属性的类型,对于基本数据类型以及日期类型会自动转换。
    日期类型只支持yyyy-MM-dd格式。
    如果需要指定格式,需要自定义类型转换器,自定义转换器分为两种:

    • 局域类型转换器
    • 全局类型转换器

    Struts转换器API
    |- TypeConverter :转换器接口

    |- DefaultTypeConverter :默认类型转换器类

    |- StrutsTypeConverter :用户编写的转换器类,继承此类即可

    3.2.局部转换器开发步骤

    1.自定义转换器继承StrutsTypeConverter
    2.重写converFormString和converToString方法
    3.注册转换器:

    • 3.1.在Action所在包中建立Action名-conversion.properties
    • 3.2.在3.1文件中添加以下数据:
    • 需要转的字段名=转换器类的项目内路径名,如:`user.birth=utils.MyConverter‘

    总结:局部转换器不能其他人的Action使用

    3.3.全局类型转换器开发步骤

    1.自定义转换器继承StrutsTypeConverter
    2.重写converFormString和converToString方法
    3.注册转换器:

    • 3.1.下项目src目录下建立以下固定文件:xwork-conversion.properties
    • 3.2.在3.1文件中添加以下数据:
    • 需要转的类的类型=转换器类的项目内路径名,如:`java.util.Date=utils.MyConverter‘

    总结:
    该拦截器负责对错误信息进行拦截器:<interceptor name="conversionError“ class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>

    以上两种方法的自定义类型转换的转换器代码为:

    package utils;
    
    import org.apache.struts2.util.StrutsTypeConverter;
    
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Map;
    
    /**
     * 自定义类型转换器类
     */
    public class MyConverter extends StrutsTypeConverter {
    
    
        /**
         * 把String转换为指定的类型【String to Date】
         * @param context : 当前上下文环境
         * @param values : jsp表单提交的字符串的值
         * @param toClass : 要转换为的目标类型
         * @return 返回转换好的目标类型数值
         */
        public Object convertFromString(Map context, String[] values, Class toClass) {
            try {
                //判断:内容不能为空
                if (values==null || values.length==0){
                    return null;
                }
                //判断:类型必须为Date
                if (Date.class != toClass){
                    return null;
                }
                //转换
                SimpleDateFormat sdf = new SimpleDateFormat("yyyMMdd");
                return sdf.parse(values[0]);
            } catch (ParseException e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            }
        }
    
        public String convertToString(Map context, Object o) {
            return null;
        }
    }
    
    

    此代码中仍有不足,没有写convertToString的方法。写好这个类就可以按照上面的配置步骤进行配置,就可以使用了。

  • 相关阅读:
    【HTML5 绘图与动画】使用canvas
    【H5新增元素和文档结构】新的全局属性 1. contentEditable 可编辑内容 2. contextmenu 快捷菜单 3. data 自定义属性 4. draggable 可拖动 5. dropzone 拖动数据 6. hidden 隐藏 7. spellcheck 语法检查 8. translate 可翻译
    【H5新增元素和文档结构】完善旧元素 1. a 超链接 2. ol 有序列表 3. dl 定义列表 4. cite 引用文本 5. small 小号字体 6. iframe 浮动框架 7. script 脚本
    【H5新增元素和文档结构】新的语义信息 1. address 2. time 3. figure 跟 figcaption 4. details 和 summary 5. mark 6. progress 7. meter 8. dialog 9.bdi 10. wbr 11. ruby、rt、rp 12. command
    【H5新增元素跟文档结构】新的文档结构 1. article 文章块 2. section 区块 3. nav 导航条 4. aside 辅助栏 5. main 主要区域 6. header 标题栏 7. hgroup 标题组 8. footer 页脚栏
    5_PHP数组_3_数组处理函数及其应用_9_数组集合运算函数
    【华为云技术分享】鲲鹏弹性云服务器GCC交叉编译环境搭建指南
    【华为云技术分享】7 分钟全面了解位运算
    【华为云技术分享】Linux内核编程环境 (1)
    【华为云技术分享】华为云MySQL 8.0正式商用,全新增强版开源利器强势来袭
  • 原文地址:https://www.cnblogs.com/cenyu/p/6219944.html
Copyright © 2011-2022 走看看