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. 解决dubbo-admin管控台不能显示服务的问题

    1.首先在网上下载了dubbo-admin.war,解压后修改dubbo.properties文件 dubbo.registry.address=zookeeper://127.0.0.1:2181 ...

  2. eclipse中安装thymeleaf插件完成thymeleaf模板中自动代码提示功能

    插件地址:https://github.com/thymeleaf/thymeleaf-extras-eclipse-plugin 页面有介绍如何使用:

  3. webpack前端构建工具学习总结(一)之webpack安装、创建项目

    npm是随nodeJs安装包一起安装的包管理工具,能解决NodeJS代码部署上的很多问题: 常见的使用场景有以下几种: 允许用户从NPM服务器下载别人编写的第三方包到本地使用. 允许用户从NPM服务器 ...

  4. win10下同时安装jdk1.7,1.8

    摘要:在开发不同项目时,可能会用到不同的jdk,需要我们在不同的jdk之间切换,怎么样在同一电脑上装不同的jdk,以此总结 1.正常安装jdk1.7,1.8     显示安装了jdk1.7,再安装jd ...

  5. simotion读写CF卡,保存/读取变量

    simotion读写CF卡功能 1 使用西门子的Simotion运动控制器时,有时需要用到 读/写 CF卡的功能.主要来自以下几个方面的需求. 1)用户数据量较大,可保持(retain)存储区的容量不 ...

  6. Codeforces Round #261 (Div. 2) - E (459E)

    题目连接:http://codeforces.com/contest/459/problem/E 题目大意:给定一张有向图,无自环无重边,每条边有一个边权,求最长严格上升路径长度.(1≤n,m≤3 * ...

  7. phpStudy-在使用phpMyAdmin报404Error

    今天刚刚知道什么是phpStudy和phpMyAdmin,感觉还可以吧.熬到凌晨两点多就为看这点东西.结果不知道怎么回事,当我在网上转一圈回来后发现自己的数据管理器竟然进不进去了! 神马情况啊?我的解 ...

  8. Codeforces Codeforces Round #383 (Div. 2) E (DFS染色)

    题目链接:http://codeforces.com/contest/742/problem/E 题意: 有一个环形的桌子,一共有n对情侣,2n个人,一共有两种菜. 现在让你输出一种方案,满足以下要求 ...

  9. 【转】Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  10. arXiv 上传文章过程

      arXiv属于预印本服务的一种,是指科研工作者的研究成果还未在正式出版物上发表,而出于和同行交流目的自愿先在学术会议上或通过互联网发布的科研论文.科技报告等文章.与刊物发表的文章以及网页发布的文章 ...