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的方法。写好这个类就可以按照上面的配置步骤进行配置,就可以使用了。

  • 相关阅读:
    同步与异步接口
    教你用 WEB SPEECH API 和 node.js 创建 一个简单的AI
    face ++ 人脸识别技术初步
    php ddos 安全处理代码
    基于GBT28181:SIP协议组件开发-----------第五篇SIP注册流程eXosip2实现(二)
    基于GBT28181:SIP协议组件开发-----------第四篇SIP注册流程eXosip2实现(一)
    基于GBT28181:SIP协议组件开发-----------第三篇SIP注册流程分析实现
    基于GBT28181:SIP协议组件开发-----------第二篇SIP组件开发原理
    基于GBT28181:SIP协议组件开发-----------第一篇环境搭建
    qt二维码示例
  • 原文地址:https://www.cnblogs.com/cenyu/p/6219944.html
Copyright © 2011-2022 走看看