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. Struts2_带参数的结果集

    页面请求: <a href="user/user?type=1">传参数</a> action: public Integer type; public S ...

  2. C++常用字符串分割方法(转)

    1.用strtok函数进行字符串分割 原型: char *strtok(char *str, const char *delim); 功能:分解字符串为一组字符串. 参数说明:str为要分解的字符串, ...

  3. Mac下配置apach服务

    有的时候,我们需要在内网工作组中分享一些文件或是后台接口没有及时给出,你又想要模拟真实数据,直接在项目里创建plist也可以做到这种需求,但难免让工程变得冗余且看起来比较Low.这个时候就看出配置本地 ...

  4. Hadoop federation配置

    Hadoop federation配置 1.介绍 hadoop federation也称为联邦,主要是对namenode进行扩容.HA模式下只是实现了hadoop namenode的高可用,但是随着文 ...

  5. Open Data for Deep Learning

    Open Data for Deep Learning Here you’ll find an organized list of interesting, high-quality datasets ...

  6. PHP设计模式之单例模式

    <?php #千锋PHP http://www.qfedu.com/php/? #千锋PHP http://www.qfedu.com/php/? namespace app; /** * Cl ...

  7. 电路设计软件 电路模拟软件 sPlan , LTspice 等

    电路设计/PCB绘制 立创EDA https://lceda.cn/ sPlan http://www.electronic-software-shop.com/splan-70.html?langu ...

  8. Xcode SDK模拟器安装及安装路径

    将SDK想要装的版本,将SDK包放入‘mac中的SDK安装路径’.再将Xcode模拟器重启. 再打开Xcode模拟器,就可以在菜单栏的 ‘硬件’->’设备‘->’iPhone Retina ...

  9. jade在命令行实时编译

    jade文件: doctype html html head title jade study body h1 imoock jade study 在jade文件夹下,终端输入 jade index. ...

  10. 剑指offer25 二叉树中和为某一直的路径

    先序遍历 class Solution { public: vector<vector<int> > FindPath(TreeNode* root,int expectNum ...