struts2架构剖析-Action

struts2架构剖析Action


一.XWork--Struts2基础
--与WebWork2相同,Struts2框架也是由两部分组成XWork2和Struts2
--XWork是一个命令模式框架,它提供了很多核心的功能:
     -IoC(Inversion of control,控制反转)容器
     -强大的表达式语言(OGNL:Object Graph Navigation Language----对象图像导航语言)
     -数据类型转换
     -验证和可插入的配置
--XWork框架的核心概念包括action,拦截器(inerceptor)和result



二.Struts2与XWork2之间的交互
    一个HTTP请求到达Struts2的FilterDispatcher之后,就会被转换成一个action command,这个action command在穿越了一系列Struts2和XWork的拦截器(1-3)之后,最后执行用户编写的Action实例,在Action执行后,响应还会穿越相同的拦截器,按照与请求相反的顺序即拦截器(3-1),最后通过Struts2的HttpServletResponse转换成Web可识别的响应,如JSP.

三.接受用户数据问题
--开发Web应用程序,首先应会遇到对用户输入数据的接收,传统的Web应用程序是由开发人员调用HttpServletRequest的getparameter(String name)方法从请求中获取数据,而Web框架都提供了数据绑定机制,由框架从请求中获取数据然后绑定到一个JavaBean对象中。
--Struts2的action完全与Web解耦,要获取Web层的数据,需要使用ActionContext,它为action提供了一个执行上下文。



<1>.第一种接收数据方式:使用领域对象接受用户输入(username和password名称必须与bean里面的对应)

第一步:先建立一个动态工程,然后部署一下struts2开发环境(导六个基本包,配置web.xml,在src下建立struts.xml文件)


第二步:编写login.jsp页面,内容为:
[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  2. <%@ taglib prefix = "s" uri = "/struts-tags"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>My JSP 'login.jsp' starting page</title>  
  15.       
  16.     <meta http-equiv="pragma" content="no-cache">  
  17.     <meta http-equiv="cache-control" content="no-cache">  
  18.     <meta http-equiv="expires" content="0">      
  19.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  20.     <meta http-equiv="description" content="This is my page">  
  21.     <!-- 
  22.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  23.     -->  
  24.   
  25.   
  26.   </head>  
  27.     
  28.   <body >  
  29. <s:form method = "post" action = "/struts2/login">  
  30.   
  31.   
  32. <s:textfield name = "user.username" label = "用户名"></s:textfield>  
  33. <s:password name = "user.password" label = "密码"></s:password>  
  34. <s:submit name = "submit" value = "登录"></s:submit>  
  35.   
  36.   
  37.   
  38.   
  39.   
  40.   
  41. </s:form>  
  42.   
  43.   
  44.   </body>  
  45. </html>  


第三步:编写User类,内容为:
[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. public class User {  
  5. private String username;  
  6. private String password;  
  7. private int age;  
  8. public User(String username, String password, int age) {  
  9.     super();  
  10.     this.username = username;  
  11.     this.password = password;  
  12.     this.age = age;  
  13. }  
  14. public String getUsername() {  
  15.     return username;  
  16. }  
  17. public void setUsername(String username) {  
  18.     this.username = username;  
  19. }  
  20. public String getPassword() {  
  21.     return password;  
  22. }  
  23. public void setPassword(String password) {  
  24.     this.password = password;  
  25. }  
  26. public int getAge() {  
  27.     return age;  
  28. }  
  29. public void setAge(int age) {  
  30.     this.age = age;  
  31. }  
  32. public User() {  
  33.     super();  
  34. }  
  35.   
  36.   
  37. }  


第四步:编写UserAction类,内容为:
[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. import com.opensymphony.xwork2.ActionSupport;  
  5.   
  6.   
  7. public class UserAction extends ActionSupport {  
  8.     private User user;  
  9.   
  10.   
  11.     public User getUser() {  
  12.         return user;  
  13.     }  
  14.   
  15.   
  16.     public void setUser(User user) {  
  17.         this.user = user;  
  18.     }  
  19.   
  20.   
  21.     public String execute() {  
  22.         if (user.getUsername().equals("zhangsan")  
  23.                 && user.getPassword().equals("123")){  
  24.   
  25.   
  26.             System.out.print("登陆成功!!!");  
  27.             return SUCCESS;  
  28.         }else{  
  29.             return ERROR;  
  30.         }  
  31.   
  32.   
  33.     }  
  34. }  

第五步:配置struts.xml文件,内容为:
[html]  view plain copy
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.   
  6.   
  7. <struts>  
  8.   
  9.   
  10.     <constant name="struts.enable.DynamicMethodInvocation" value="false" />  
  11.     <constant name="struts.devMode" value="false" />  
  12.   
  13.   
  14.     <include file="example.xml"/>  
  15.   
  16.   
  17.   
  18.   
  19.   
  20.   
  21.     <package name="STRUTS" namespace="/struts2" extends="struts-default">  
  22.           
  23.         <action name="login" class = "app.neusoft.UserAction">  
  24.             <result>/success.jsp</result>  
  25.         </action>  
  26.     </package>  
  27.   
  28.   
  29.   
  30.   
  31.   
  32.   
  33. </struts>  



第六步:发布工程,运行login.jsp,输入用户名"zhangsan"和密码"123",验证结果!


如果用户登录成功,则说明接收到了数据,否则就是没有接收到!!!



<2>.第二种接收数据方式:使用ModelDriven action(username和password名称必须与bean里面的对应)

--ModelDriven接口只有一个方法public T getModel()
--用此方法时,登陆页面不能写成user.username和user,password了



在第一步的情况下,只需要把login.jsp页面改成:
[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  2. <%@ taglib prefix = "s" uri = "/struts-tags"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>My JSP 'login.jsp' starting page</title>  
  15.       
  16.     <meta http-equiv="pragma" content="no-cache">  
  17.     <meta http-equiv="cache-control" content="no-cache">  
  18.     <meta http-equiv="expires" content="0">      
  19.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  20.     <meta http-equiv="description" content="This is my page">  
  21.     <!-- 
  22.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  23.     -->  
  24.   
  25.   
  26.   </head>  
  27.     
  28.   <body >  
  29. <s:form method = "post" action = "/struts2/login">  
  30.   
  31.   
  32. <s:textfield name = "username" label = "用户名"></s:textfield>  
  33. <s:password name = "password" label = "密码"></s:password>  
  34. <s:submit name = "submit" value = "登录"></s:submit>  
  35.   
  36.   
  37.   
  38.   
  39.   
  40.   
  41. </s:form>  
  42.   
  43.   
  44.   </body>  
  45. </html>  


把UserAction改为:
[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import com.opensymphony.xwork2.ModelDriven;  
  6.   
  7.   
  8. public class UserAction extends ActionSupport implements ModelDriven {  
  9.     private User user = new User();  
  10.   
  11.   
  12.     public User getModel() {  
  13.         // TODO Auto-generated method stub  
  14.         return user;  
  15.     }  
  16.   
  17.   
  18.     public String execute() {  
  19.         if (user.getUsername().equals("zhangsan")  
  20.                 && user.getPassword().equals("123")) {  
  21.   
  22.   
  23.             System.out.print("登陆成功!!!");  
  24.             return SUCCESS;  
  25.         } else {  
  26.             return ERROR;  
  27.         }  
  28.   
  29.   
  30.     }  
  31.   
  32.   
  33. }  




其他同上!!!



<3>.第三种接收数据方式:使用action属性接受用户输入(username和password名称必须与bean里面的对应)
--此种方法使用时不需要写一个javabean了,就是可以删除User类了,登陆页面也不要写成user.username了,只需要把User类中的内容写到UserAction中就可以了,

UserAction中的内容为:
[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. import com.opensymphony.xwork2.ActionSupport;  
  5. import com.opensymphony.xwork2.ModelDriven;  
  6.   
  7.   
  8. public class UserAction extends ActionSupport {  
  9.     private String username;  
  10.     private String password;  
  11.     private int age;  
  12.   
  13.   
  14.     public String getUsername() {  
  15.         return username;  
  16.     }  
  17.     public void setUsername(String username) {  
  18.         this.username = username;  
  19.     }  
  20.     public String getPassword() {  
  21.         return password;  
  22.     }  
  23.     public void setPassword(String password) {  
  24.         this.password = password;  
  25.     }  
  26.     public int getAge() {  
  27.         return age;  
  28.     }  
  29.     public void setAge(int age) {  
  30.         this.age = age;  
  31.     }  
  32.   
  33.   
  34.       
  35.     public String execute() {  
  36.         if (username.equals("zhangsan")  
  37.                 && password.equals("123")) {  
  38.   
  39.   
  40.             System.out.print("登陆成功!!!");  
  41.             return SUCCESS;  
  42.         } else {  
  43.             return ERROR;  
  44.         }  
  45.   
  46.   
  47.     }  
  48.   
  49.   
  50. }  

其他同上!!!


四.访问request,session,application对象


1.与servletAPI解耦的访问方式
 
<1>.通过ActionContext访问
 
login.jsp页面内容为:

[html]  view plain copy
  1. <%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>  
  2. <%@ taglib prefix = "s" uri = "/struts-tags"%>  
  3. <%  
  4. String path = request.getContextPath();  
  5. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  6. %>  
  7.   
  8.   
  9. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  10. <html>  
  11.   <head>  
  12.     <base href="<%=basePath%>">  
  13.       
  14.     <title>My JSP 'login.jsp' starting page</title>  
  15.       
  16.     <meta http-equiv="pragma" content="no-cache">  
  17.     <meta http-equiv="cache-control" content="no-cache">  
  18.     <meta http-equiv="expires" content="0">      
  19.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  20.     <meta http-equiv="description" content="This is my page">  
  21.     <!-- 
  22.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  23.     -->  
  24.   
  25.   
  26.   </head>  
  27.     
  28.   <body >  
  29. <s:form method = "post" action = "/struts2/login">  
  30.   
  31.   
  32. <s:textfield name = "username" label = "用户名"></s:textfield>  
  33. <s:password name = "password" label = "密码"></s:password>  
  34. <s:submit name = "submit" value = "登录"></s:submit>  
  35.   
  36.   
  37.   
  38.   
  39.   
  40.   
  41. </s:form>  
  42.   
  43.   
  44.   </body>  
  45. </html>  


User类内容为:
[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. public class User {  
  5. private String username;  
  6. private String password;  
  7. private int age;  
  8.   
  9.   
  10. public String getUsername() {  
  11.     return username;  
  12. }  
  13. public void setUsername(String username) {  
  14.     this.username = username;  
  15. }  
  16. public String getPassword() {  
  17.     return password;  
  18. }  
  19. public void setPassword(String password) {  
  20.     this.password = password;  
  21. }  
  22. public int getAge() {  
  23.     return age;  
  24. }  
  25. public void setAge(int age) {  
  26.     this.age = age;  
  27. }  
  28.   
  29.   
  30. }  


UserAction类内容为:


[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. import java.util.Map;  
  5.   
  6.   
  7. import com.opensymphony.xwork2.ActionContext;  
  8. import com.opensymphony.xwork2.ActionSupport;  
  9. import com.opensymphony.xwork2.ModelDriven;  
  10.   
  11.   
  12. public class UserAction extends ActionSupport implements ModelDriven {  
  13.     private User user = new User();  
  14.   
  15.   
  16.     public User getModel() {  
  17.         // TODO Auto-generated method stub  
  18.         return user;  
  19.     }  
  20.   
  21.   
  22.     public String execute() {  
  23.         if (user.getUsername().equals("zhangsan")  
  24.                 && user.getPassword().equals("123")) {  
  25.   
  26.   
  27.             System.out.print("登陆成功!!!");  
  28.             ActionContext ctx = ActionContext.getContext();  
  29.             Map request = (Map) ctx.get("request");  
  30.             Map session = ctx.getSession();  
  31.             Map application = ctx.getApplication();  
  32.             request.put("message""欢迎来到程序员之家!");  
  33.             session.put("user",user);  
  34.             Integer count = (Integer) application.get("counter");  
  35.             if(null == count){  
  36.                 count=1;  
  37.             }else{  
  38.                 count++;  
  39.             }  
  40.             application.put("counter", count);  
  41.             return SUCCESS;  
  42.         } else {  
  43.             return ERROR;  
  44.         }  
  45.   
  46.   
  47.     }  
  48.   
  49.   
  50. }  


success.jsp内容为:

[html]  view plain copy
  1. <%@ page language="java" import="java.util.*,app.neusoft.*" pageEncoding="GB18030"%>  
  2. <%  
  3. String path = request.getContextPath();  
  4. String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
  5. %>  
  6.   
  7.   
  8. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">  
  9. <html>  
  10.   <head>  
  11.     <base href="<%=basePath%>">  
  12.       
  13.     <title>My JSP 'success.jsp' starting page</title>  
  14.       
  15.     <meta http-equiv="pragma" content="no-cache">  
  16.     <meta http-equiv="cache-control" content="no-cache">  
  17.     <meta http-equiv="expires" content="0">      
  18.     <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">  
  19.     <meta http-equiv="description" content="This is my page">  
  20.     <!-- 
  21.     <link rel="stylesheet" type="text/css" href="styles.css"> 
  22.     -->  
  23.   
  24.   
  25.   </head>  
  26.     
  27.   <body>  
  28. ${sessionScope.user.username },${requestScope.message }<br/>  
  29. 本站的访问量为:${applicationScope.counter }  
  30.   </body>  
  31. </html>  



<2>实现RequestAware,SessionAware,ApplicationAware接口,让Struts2框架在运行时向Action实例注入request,session,application对象。


UserAction类内容为:


[java]  view plain copy
  1. package app.neusoft;  
  2.   
  3.   
  4. import java.util.Map;  
  5.   
  6.   
  7. import org.apache.struts2.interceptor.ApplicationAware;  
  8. import org.apache.struts2.interceptor.RequestAware;  
  9.   
  10.   
  11. import org.apache.struts2.interceptor.SessionAware;  
  12.   
  13.   
  14. import com.opensymphony.xwork2.ActionContext;  
  15. import com.opensymphony.xwork2.ActionSupport;  
  16. import com.opensymphony.xwork2.ModelDriven;  
  17.   
  18.   
  19. public class UserAction extends ActionSupport implements ModelDriven,  
  20.         RequestAware, SessionAware, ApplicationAware {  
  21.     private User user = new User();  
  22.     private Map request;  
  23.     private Map session;  
  24.     private Map application;  
  25.   
  26.   
  27.     public User getModel() {  
  28.         // TODO Auto-generated method stub  
  29.         return user;  
  30.     }  
  31.   
  32.   
  33.     public String execute() {  
  34.         if (user.getUsername().equals("zhangsan")  
  35.                 && user.getPassword().equals("123")) {  
  36.   
  37.   
  38.             System.out.print("登陆成功!!!");  
  39.             request.put("message""欢迎来到程序员之家!");  
  40.             session.put("user", user);  
  41.             Integer count = (Integer) application.get("counter");  
  42.             if (null == count) {  
  43.                 count = 1;  
  44.             } else {  
  45.                 count++;  
  46.             }  
  47.             application.put("counter", count);  
  48.             return SUCCESS;  
  49.         } else {  
  50.             return ERROR;  
  51.         }  
  52.   
  53.   
  54.     }  
  55.   
  56.   
  57.     public void setRequest(Map request) {  
  58.         // TODO Auto-generated method stub  
  59.         this.request = request;  
  60.     }  
  61.   
  62.   
  63.     public

你可能感兴趣的:(java,struts,user,Integer,action,passwords)