zoukankan      html  css  js  c++  java
  • Struts2---数据封装机制

    Struts2属性驱动和模型驱动

    自动完成了数据的获取和封装

    LoginAction.java

    public class LoginAction implements ModelDriven<User> {
        
        private User user;
        
        public String execute() {
            if (user.getUsername().equals("admin") && user.getPassword().equals("123456")) {
                return "success";
            } else {
                return "fail";
            }
        }
    
        @Override
        public User getModel() {
            user = new User();
            return user;
        }
        
    }

    User实体类中的每个属性需要一个getset方法

    struts.xml在action标签中添加两句代码

    <interceptor-ref name="modelDriven"></interceptor-ref>
    <interceptor-ref name="defaultStack"></interceptor-ref>

    其它的类和jsp中代码与Struts2---配置文件讲解及简单登录示例这篇文章中的示例相同

    Struts2标签实现模型驱动

    LoginAction.java

    public class LoginAction extends ActionSupport {
        private Users us;
        @Override
        public String execute() throws Exception {
            System.out.println("标签实现");
            System.out.println(us.getUsername());
            System.out.println(us.getPassword());
            return "success";
        }
        public Users getUs() {
            return us;
        }
        public void setUs(Users us) {
            this.us = us;
        }
    }

    表单提交

    <!-- 在jsp中添加标签支持代码 -->
    <%@ taglib prefix="s" uri="/struts-tags" %>
    
    <!-- 设置标签表单 -->
    <s:form namespace="/userlogin" action="suserlogin" method="post">
      <s:textfield name = "us.username"/>用户名:
      <s:password name = "us.password"/>密码:
      <s:submit value="提交"  />
    </s:form>

    struts.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
    <struts>
        <!-- 设置表单默认无样式 -->
        <constant name="struts.ui.theme" value="simple" />
        <constant name="struts.ui.templateDir" value="template" />
        <constant name="struts.ui.templateSuffix" value="ftl" />
        
        <package name="userlogin" extends="struts-default">
            <action name="suserlogin" class="com.jikexueyuan.action.LoginAction">
                <result name="success">/index.jsp</result>
            </action>
        </package>
    </struts>

     

    struts2模型驱动核心机制

    将上述LoginAction继承以下servlet,其它代码不变

    public class BaseServlet extends HttpServlet {
    
        public void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            doPost(request, response);
            
        }
        //当请求发送到action之前,
        //调用 MloginAction类中getModel() 获取要将表单数据封装到哪个实例化的对象中
        //获得到该对象之后,我们可以获得 类类型
        //获得类 类型之后。获得类中的属性
        // request.getParameters获得 表单提交的所有数据名
        // 从而获取值
        // 如果表单提交的 name值 与 实体类中属性名一致
        //那么我们将获得表单中的数据 封装到us对象当中去
        public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            try {
                //在程序运行时 获得当前类的getModel方法对象
                Method method = this.getClass().getDeclaredMethod("getModel", null);
                //通过invoke方法 调用该方法 获得实体类对象
                Object ob = method.invoke(this, null);
                //通过实体类对象获得  类类型
                Class cl = ob.getClass();
                //通过类类型获得 类中的属性对象数组
                Field[] fi = cl.getDeclaredFields();
                //通过request获得所有的 表单中提交的name值 
                Enumeration em = request.getParameterNames();
                //循环枚举中的值
                while(em.hasMoreElements()){
                    //获得枚举中的值  就是表单提交的name值
                    String fieldName = em.nextElement().toString();
                    System.out.println("从表单中获得的 name值;"+fieldName);
                    //循环类中所有的属性对象
                    for(int i =0;i<fi.length;i++){
                        System.out.println("从类中获得的属性:"+fi[i].getName());
                        //判断 如果类中属性的名字 和 表单中提交的名字一致
                        if(fieldName.equals(fi[i].getName())){
                            fi[i].setAccessible(true);//尤为重要,可以被外部赋值
                            //获取request.getParameter(fieldName) 封装到对象中
                            fi[i].set(ob, request.getParameter(fieldName));
                            
                        }
                    }
                }
                //调用默认的方法 执行处理
                Method me1 = this.getClass().getDeclaredMethod("execute", null);
                //获得返回的url字符串
                Object url = me1.invoke(this, null);
                //根据返回的字符串 跳转页面
                request.getRequestDispatcher(String.valueOf(url)).forward(request, response);
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    在web.xml注册两个servlet

    <servlet>
      <servlet-name>LoginServlet</servlet-name>
      <servlet-class>com.jikexueyuan.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet>
      <servlet-name>BaseServlet</servlet-name>
      <servlet-class>com.jikexueyuan.servlet.BaseServlet</servlet-class>
    </servlet>
    
    <servlet-mapping>
      <servlet-name>LoginServlet</servlet-name>
      <url-pattern>/servlet/LoginServlet</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
      <servlet-name>BaseServlet</servlet-name>
      <url-pattern>/servlet/BaseServlet</url-pattern>
    </servlet-mapping>
  • 相关阅读:
    提供者批量启用脚本
    git clone 拉取github上面的代码报错:fatal: Authentication failed for xxx解决
    python-jenkins 操作
    批量增加数据库数据
    利用GIt命令上传项目到GitHub指定仓库
    git命令
    charles请求入参中有乱码
    appium+python+jenkins+selenium grid+unnittest+生成报告打造UI自动化回归、监控体系
    python3抓取中国天气网不同城市7天、15天实时数据
    python3爬取动态网站图片
  • 原文地址:https://www.cnblogs.com/xiaobaizhiqian/p/7895381.html
Copyright © 2011-2022 走看看