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. js关于cookie的各种方法

    //删除cookiedelCookie("GroupName");//s20是代表20秒//h是指小时,如12小时则是:h12//d是天数,30天则:d30setCookie(&q ...

  2. Centos 6.5_64bit 下安装 Zabbix server 3.0监控主机的加入

    安装Zabbix server 3.0客户端之前需要先关闭selinux和打开10050和10051端口   关闭selinux   1      vi /etc/selinux/config 2   ...

  3. CentOS6下DHCP服务(二)简单配置案例及故障排查

    1.预分配网络参数如下:linux服务器:eth0 IP为192.168.8.250  做为局域网DHCP服务器局域网网段设置为192.168.8.0/24:内部计算机的router为192.168. ...

  4. Vim插件推荐

    看下文时要知道我的<leader>键就是\. ctags C程序阅读辅助工具.在看C/C++代码的时候经常需要在文件之间跳来跳去,这是很麻烦的事,ctags就是解决这种问题的.ctags是 ...

  5. API:Sign签名的执行流程

    Sign签名存在目的:为了防止不法分子修改参数数据,进而攻击服务器,导致数据泄露或从中获得利益    例如:一个接口是用户把积分转帐给他的朋友,修改后,变为转帐到攻击者的帐户,这样,攻击者就能得到利益 ...

  6. IOS http协议 总结

    HTTP协议1.面试题常见:聊一下HTTP协议(协议的完整的通信过程) ============================================================ 一.一 ...

  7. 【转】WebSocket 是什么原理?为什么可以实现持久连接?

    WebSocket是HTML5出的东西 也就是说HTTP协议没有变化 但HTTP是不支持持久连接的(长连接,循环连接的不算)或者说WebSocket干脆就不是基于HTTP来执行的.但是...说不通啊. ...

  8. Spring Java配置

    Java配置 Java配置是Spring 4.x推荐的配置方式,可以完全替代xml配置:Java配置也是Sping Boot 推荐的配置方式.Java配置是通过@Configuration和@Bean ...

  9. Python,针对指定文件类型,过滤空行和注释,统计行数

    参考网络上代码编辑而成,无技术含量,可自行定制: 目前亲测有效,若有待完善之处,还望指出! 强调:将此统计py脚本放置项目的根目录下执行即可. 1.遍历文件,递归遍历文件夹中的所有 def getFi ...

  10. css权值问题

    继承是没有权值的,比通配符的的权值0还要低. 选择器是不分上下级的.只管优先级. 第一等:代表内联样式,如: style=””,权值为1000. 第二等:代表ID选择器,如:#content,权值为0 ...