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>