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>

Struts2---数据封装机制的更多相关文章

  1. Struts2中数据封装机制

    Struts2当中数据封装的三种机制:属性驱动.标签驱动.模型驱动.下面来一一介绍. 一.属性驱动 1.需要提供对应属性的set方法进行数据的封装. 2.表单的哪些属性需要封装数据,那么在对应的Act ...

  2. struts2运行机制

    struts2是web应用中一个常用的mvc框架,下面探讨一下其内部运行机制: 1.从客服端浏览器输入的url后,客服端通过http协议发送一个请求到服务器(tomcat),Tomcat收到这个请求之 ...

  3. Struts2数据封装

    首先是简单数据类型的封装 jsp页面 <%@ page contentType="text/html;charset=UTF-8" language="java&q ...

  4. Struts2运行机制(MVC)的分析:

    C:(controller)控制器          M:(model)模型处理    V:(view)视图 Struts 2 的运行过程:     核心控制器是FilterDispatcher会过滤 ...

  5. JAVA框架Struts2 数据封装

    一.strust2封装数据包含二部分: 数据在到Action类的时候,会经过拦截器,拦截器会有很多功能:比如数据封装.类型转换等. 我可以查看下strust-default.xml文件,看那些拦截器默 ...

  6. struts2异常处理机制

    一.处理一般异常(javaBean异常) struts2进行异常处理首先需要添加exception拦截器,而默认拦截器栈已经加入了这个拦截器,所以不用特意的声明.在Struts 2框架中,采用声明式异 ...

  7. Struts2 源码分析——核心机制

    MVC和三层的看法 通过上一章我们明白我们要学习的知识点和目标.所以这章我将从使用者来讲struts2的机制原理.我们都清楚的知道struts2的核心思想是MVC思想.MVC全名是Model View ...

  8. 小学生之浅谈Struts2与struts1的运行机制

    Struts1工作原理图: 1.初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(s ...

  9. Struts2的数据封装

    在很多的实际开发场景中,页面提交请求参数Action ,在Action中接收参数并对接收的数据进行封装.封装到一个JavaBean中,将JavaBean传递给业务层中.Struts2数据封装分为两类: ...

  10. Struts2架构分析和执行机制

    实例分析 1.在浏览器中输入url地址后,会通过http协议发送给tomcat,tomacat收到请求后查看訪问的是哪个 webapplication(例如以下图的Struts2_0100_Intro ...

随机推荐

  1. 手机APP 后端设计

      原则:   命名知其意. 一看api名字就知道这个api是干啥.   api返回数据禁止null   服务器动态处理原图(如 60x60 .80x80).  例如,客户端需要图片(http://w ...

  2. [原创]在Debian9上配置NAS

    序言 此教程安装的都是最新版本的.由于是当NAS让它非常稳定的运行,所以能不安装的软件尽量不要安装. 一.准备工作 1. 更新系统 没啥,就他喵想用个最新的. apt update && ...

  3. sql分组数据去重

    #分组获得每个机柜里服务器占用的机架总数,如552807e6-b428-4184-b219-ae368c68ddb3占用4个 mysql> select cabinet_uuid, count( ...

  4. Springboot中SpringMvc拦截器配置与应用(实战)

    一.什么是拦截器,及其作用 拦截器(Interceptor): 用于在某个方法被访问之前进行拦截,然后在方法执行之前或之后加入某些操作,其实就是AOP的一种实现策略.它通过动态拦截Action调用的对 ...

  5. lrzsz的使用

    可以方便的在本地PC机和远程服务器之间传输文件. 1.下载 直接在centos上执行命令yum -y install lrzsz 2.上传文件 rz // 上传文件,执行命令rz,会跳出文件选择窗口, ...

  6. kubernetes组件helm

    1.安装helm Helm由客户端helm命令行工具和服务端tiller组成,Helm的安装十分简单. 下载helm命令行工具到master节点node1的/usr/local/bin下(只需要在其中 ...

  7. 屏蔽各类弹窗广告(WPS、智能云输入法)

    托盘中的广告“领取双11红包,最高1111元”的罪魁祸首是“智能云输入法” 广告在托盘中闪动: 结束SCSkinInst.exe后,托盘中的广告消失: 智能云输入法的安装路径可参考: C:\Progr ...

  8. May 2 2017 Week 18 Tuesday

    The beauty of the journey is found in the scenery along the way. 旅行之美在于沿途所见的风景. Several years ago, I ...

  9. UOJ #207. 共价大爷游长沙

    #207. 共价大爷游长沙 链接:http://uoj.ac/problem/207 题意:给一棵树,要求支持加边.删边.询问一条边是否被所有路径覆盖.同时路径端点集合有加入与删除操作. 想法: 考虑 ...

  10. Selenium入门系列5 默认不显示的下拉列表元素操作

    本节课程的下拉框是那种默认隐藏,当鼠标移到菜单上下拉框才显示的.如果直接getelement会报错,提示元素不可见: so,得先让下拉列表显示出来再获取元素 用到的新知识: is_display()  ...