struts2架构剖析-Action

本文介绍Struts2框架中三种接收用户数据的方式及如何访问request、session、application对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  8. <html>
  9. <head>
  10. <basehref="<%=basePath%>">
  11. <title>MyJSP'login.jsp'startingpage</title>
  12. <metahttp-equiv="pragma"content="no-cache">
  13. <metahttp-equiv="cache-control"content="no-cache">
  14. <metahttp-equiv="expires"content="0">
  15. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  16. <metahttp-equiv="description"content="Thisismypage">
  17. <!--
  18. <linkrel="stylesheet"type="text/css"href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <s:formmethod="post"action="/struts2/login">
  23. <s:textfieldname="user.username"label="用户名"></s:textfield>
  24. <s:passwordname="user.password"label="密码"></s:password>
  25. <s:submitname="submit"value="登录"></s:submit>
  26. </s:form>
  27. </body>
  28. </html>


第三步:编写User类,内容为:
[java] view plain copy
  1. packageapp.neusoft;
  2. publicclassUser{
  3. privateStringusername;
  4. privateStringpassword;
  5. privateintage;
  6. publicUser(Stringusername,Stringpassword,intage){
  7. super();
  8. this.username=username;
  9. this.password=password;
  10. this.age=age;
  11. }
  12. publicStringgetUsername(){
  13. returnusername;
  14. }
  15. publicvoidsetUsername(Stringusername){
  16. this.username=username;
  17. }
  18. publicStringgetPassword(){
  19. returnpassword;
  20. }
  21. publicvoidsetPassword(Stringpassword){
  22. this.password=password;
  23. }
  24. publicintgetAge(){
  25. returnage;
  26. }
  27. publicvoidsetAge(intage){
  28. this.age=age;
  29. }
  30. publicUser(){
  31. super();
  32. }
  33. }


第四步:编写UserAction类,内容为:
[java] view plain copy
  1. packageapp.neusoft;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. publicclassUserActionextendsActionSupport{
  4. privateUseruser;
  5. publicUsergetUser(){
  6. returnuser;
  7. }
  8. publicvoidsetUser(Useruser){
  9. this.user=user;
  10. }
  11. publicStringexecute(){
  12. if(user.getUsername().equals("zhangsan")
  13. &&user.getPassword().equals("123")){
  14. System.out.print("登陆成功!!!");
  15. returnSUCCESS;
  16. }else{
  17. returnERROR;
  18. }
  19. }
  20. }

第五步:配置struts.xml文件,内容为:
[html] view plain copy
  1. <?xmlversion="1.0"encoding="UTF-8"?>
  2. <!DOCTYPEstrutsPUBLIC
  3. "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
  4. "http://struts.apache.org/dtds/struts-2.0.dtd">
  5. <struts>
  6. <constantname="struts.enable.DynamicMethodInvocation"value="false"/>
  7. <constantname="struts.devMode"value="false"/>
  8. <includefile="example.xml"/>
  9. <packagename="STRUTS"namespace="/struts2"extends="struts-default">
  10. <actionname="login"class="app.neusoft.UserAction">
  11. <result>/success.jsp</result>
  12. </action>
  13. </package>
  14. </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. <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  8. <html>
  9. <head>
  10. <basehref="<%=basePath%>">
  11. <title>MyJSP'login.jsp'startingpage</title>
  12. <metahttp-equiv="pragma"content="no-cache">
  13. <metahttp-equiv="cache-control"content="no-cache">
  14. <metahttp-equiv="expires"content="0">
  15. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  16. <metahttp-equiv="description"content="Thisismypage">
  17. <!--
  18. <linkrel="stylesheet"type="text/css"href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <s:formmethod="post"action="/struts2/login">
  23. <s:textfieldname="username"label="用户名"></s:textfield>
  24. <s:passwordname="password"label="密码"></s:password>
  25. <s:submitname="submit"value="登录"></s:submit>
  26. </s:form>
  27. </body>
  28. </html>


把UserAction改为:
[java] view plain copy
  1. packageapp.neusoft;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importcom.opensymphony.xwork2.ModelDriven;
  4. publicclassUserActionextendsActionSupportimplementsModelDriven{
  5. privateUseruser=newUser();
  6. publicUsergetModel(){
  7. //TODOAuto-generatedmethodstub
  8. returnuser;
  9. }
  10. publicStringexecute(){
  11. if(user.getUsername().equals("zhangsan")
  12. &&user.getPassword().equals("123")){
  13. System.out.print("登陆成功!!!");
  14. returnSUCCESS;
  15. }else{
  16. returnERROR;
  17. }
  18. }
  19. }




其他同上!!!



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

UserAction中的内容为:
[java] view plain copy
  1. packageapp.neusoft;
  2. importcom.opensymphony.xwork2.ActionSupport;
  3. importcom.opensymphony.xwork2.ModelDriven;
  4. publicclassUserActionextendsActionSupport{
  5. privateStringusername;
  6. privateStringpassword;
  7. privateintage;
  8. publicStringgetUsername(){
  9. returnusername;
  10. }
  11. publicvoidsetUsername(Stringusername){
  12. this.username=username;
  13. }
  14. publicStringgetPassword(){
  15. returnpassword;
  16. }
  17. publicvoidsetPassword(Stringpassword){
  18. this.password=password;
  19. }
  20. publicintgetAge(){
  21. returnage;
  22. }
  23. publicvoidsetAge(intage){
  24. this.age=age;
  25. }
  26. publicStringexecute(){
  27. if(username.equals("zhangsan")
  28. &&password.equals("123")){
  29. System.out.print("登陆成功!!!");
  30. returnSUCCESS;
  31. }else{
  32. returnERROR;
  33. }
  34. }
  35. }

其他同上!!!


四.访问request,session,application对象


1.与servletAPI解耦的访问方式

<1>.通过ActionContext访问

login.jsp页面内容为:

[html] view plain copy
  1. <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
  2. <%@taglibprefix="s"uri="/struts-tags"%>
  3. <%
  4. Stringpath=request.getContextPath();
  5. StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  6. %>
  7. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  8. <html>
  9. <head>
  10. <basehref="<%=basePath%>">
  11. <title>MyJSP'login.jsp'startingpage</title>
  12. <metahttp-equiv="pragma"content="no-cache">
  13. <metahttp-equiv="cache-control"content="no-cache">
  14. <metahttp-equiv="expires"content="0">
  15. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  16. <metahttp-equiv="description"content="Thisismypage">
  17. <!--
  18. <linkrel="stylesheet"type="text/css"href="styles.css">
  19. -->
  20. </head>
  21. <body>
  22. <s:formmethod="post"action="/struts2/login">
  23. <s:textfieldname="username"label="用户名"></s:textfield>
  24. <s:passwordname="password"label="密码"></s:password>
  25. <s:submitname="submit"value="登录"></s:submit>
  26. </s:form>
  27. </body>
  28. </html>


User类内容为:
[java] view plain copy
  1. packageapp.neusoft;
  2. publicclassUser{
  3. privateStringusername;
  4. privateStringpassword;
  5. privateintage;
  6. publicStringgetUsername(){
  7. returnusername;
  8. }
  9. publicvoidsetUsername(Stringusername){
  10. this.username=username;
  11. }
  12. publicStringgetPassword(){
  13. returnpassword;
  14. }
  15. publicvoidsetPassword(Stringpassword){
  16. this.password=password;
  17. }
  18. publicintgetAge(){
  19. returnage;
  20. }
  21. publicvoidsetAge(intage){
  22. this.age=age;
  23. }
  24. }


UserAction类内容为:


[java] view plain copy
  1. packageapp.neusoft;
  2. importjava.util.Map;
  3. importcom.opensymphony.xwork2.ActionContext;
  4. importcom.opensymphony.xwork2.ActionSupport;
  5. importcom.opensymphony.xwork2.ModelDriven;
  6. publicclassUserActionextendsActionSupportimplementsModelDriven{
  7. privateUseruser=newUser();
  8. publicUsergetModel(){
  9. //TODOAuto-generatedmethodstub
  10. returnuser;
  11. }
  12. publicStringexecute(){
  13. if(user.getUsername().equals("zhangsan")
  14. &&user.getPassword().equals("123")){
  15. System.out.print("登陆成功!!!");
  16. ActionContextctx=ActionContext.getContext();
  17. Maprequest=(Map)ctx.get("request");
  18. Mapsession=ctx.getSession();
  19. Mapapplication=ctx.getApplication();
  20. request.put("message","欢迎来到程序员之家!");
  21. session.put("user",user);
  22. Integercount=(Integer)application.get("counter");
  23. if(null==count){
  24. count=1;
  25. }else{
  26. count++;
  27. }
  28. application.put("counter",count);
  29. returnSUCCESS;
  30. }else{
  31. returnERROR;
  32. }
  33. }
  34. }


success.jsp内容为:

[html] view plain copy
  1. <%@pagelanguage="java"import="java.util.*,app.neusoft.*"pageEncoding="GB18030"%>
  2. <%
  3. Stringpath=request.getContextPath();
  4. StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
  5. %>
  6. <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
  7. <html>
  8. <head>
  9. <basehref="<%=basePath%>">
  10. <title>MyJSP'success.jsp'startingpage</title>
  11. <metahttp-equiv="pragma"content="no-cache">
  12. <metahttp-equiv="cache-control"content="no-cache">
  13. <metahttp-equiv="expires"content="0">
  14. <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
  15. <metahttp-equiv="description"content="Thisismypage">
  16. <!--
  17. <linkrel="stylesheet"type="text/css"href="styles.css">
  18. -->
  19. </head>
  20. <body>
  21. ${sessionScope.user.username},${requestScope.message}<br/>
  22. 本站的访问量为:${applicationScope.counter}
  23. </body>
  24. </html>



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


UserAction类内容为:


[java] view plain copy
  1. packageapp.neusoft;
  2. importjava.util.Map;
  3. importorg.apache.struts2.interceptor.ApplicationAware;
  4. importorg.apache.struts2.interceptor.RequestAware;
  5. importorg.apache.struts2.interceptor.SessionAware;
  6. importcom.opensymphony.xwork2.ActionContext;
  7. importcom.opensymphony.xwork2.ActionSupport;
  8. importcom.opensymphony.xwork2.ModelDriven;
  9. publicclassUserActionextendsActionSupportimplementsModelDriven,
  10. RequestAware,SessionAware,ApplicationAware{
  11. privateUseruser=newUser();
  12. privateMaprequest;
  13. privateMapsession;
  14. privateMapapplication;
  15. publicUsergetModel(){
  16. //TODOAuto-generatedmethodstub
  17. returnuser;
  18. }
  19. publicStringexecute(){
  20. if(user.getUsername().equals("zhangsan")
  21. &&user.getPassword().equals("123")){
  22. System.out.print("登陆成功!!!");
  23. request.put("message","欢迎来到程序员之家!");
  24. session.put("user",user);
  25. Integercount=(Integer)application.get("counter");
  26. if(null==count){
  27. count=1;
  28. }else{
  29. count++;
  30. }
  31. application.put("counter",count);
  32. returnSUCCESS;
  33. }else{
  34. returnERROR;
  35. }
  36. }
  37. publicvoidsetRequest(Maprequest){
  38. //TODOAuto-generatedmethodstub
  39. this.request=request;
  40. }
  41. publicvoidsetSession(Mapsession){
  42. //TODOAuto-generatedmethodstub
  43. this.session=session;
  44. }
  45. publicvoidsetApplication(Mapapplication){
  46. //TODOAuto-generatedmethodstub
  47. this.application=application;
  48. }
  49. }


其他同上!!!

2.与servletAPI耦合的访问方式


<1>.通过ServletActionContext来获取HttpRequest和ServletContext对象

UserAction内容为:

[java] view plain copy
  1. packageapp.neusoft;
  2. importjavax.servlet.ServletContext;
  3. importjavax.servlet.http.HttpServletRequest;
  4. importjavax.servlet.http.HttpSession;
  5. importorg.apache.struts2.ServletActionContext;
  6. importcom.opensymphony.xwork2.ActionSupport;
  7. importcom.opensymphony.xwork2.ModelDriven;
  8. publicclassUserActionextendsActionSupportimplementsModelDriven{
  9. privateUseruser=newUser();
  10. publicUsergetModel(){
  11. //TODOAuto-generatedmethodstub
  12. returnuser;
  13. }
  14. publicStringexecute(){
  15. //ServletActionContext
  16. HttpServletRequestrequest=ServletActionContext.getRequest();
  17. HttpSessionsession=request.getSession();
  18. ServletContextapplication=ServletActionContext.getServletContext();
  19. if(user.getUsername().equals("zhangsan")
  20. &&user.getPassword().equals("123")){
  21. System.out.print("登陆成功!!!");
  22. request.setAttribute("message","欢迎来到程序员之家!");
  23. session.setAttribute("user",user);
  24. Integercount=(Integer)application.getAttribute("counter");
  25. if(null==count){
  26. count=1;
  27. }else{
  28. count++;
  29. }
  30. application.setAttribute("counter",count);
  31. returnSUCCESS;
  32. }else{
  33. returnERROR;
  34. }
  35. }
  36. }

其他同上!!!

<2>通过实现ServletAware和ServletContext接口,让Struts2框架向Action实例注入HttpRequest和ServletContext对象。

UserAction类的内容为:

[java] view plain copy
  1. packageapp.neusoft;
  2. importjavax.servlet.ServletContext;
  3. importjavax.servlet.http.HttpServletRequest;
  4. importjavax.servlet.http.HttpSession;
  5. importorg.apache.struts2.interceptor.ServletRequestAware;
  6. importorg.apache.struts2.util.ServletContextAware;
  7. importcom.opensymphony.xwork2.ActionSupport;
  8. importcom.opensymphony.xwork2.ModelDriven;
  9. publicclassUserActionextendsActionSupportimplementsModelDriven,
  10. ServletRequestAware,ServletContextAware{
  11. privateUseruser=newUser();
  12. privateHttpServletRequestrequest;
  13. privateServletContextcontext;
  14. publicUsergetModel(){
  15. //TODOAuto-generatedmethodstub
  16. returnuser;
  17. }
  18. publicStringexecute(){
  19. HttpSessionsession=request.getSession();
  20. if(user.getUsername().equals("zhangsan")
  21. &&user.getPassword().equals("123")){
  22. System.out.print("登陆成功!!!");
  23. request.setAttribute("message","欢迎来到程序员之家!");
  24. session.setAttribute("user",user);
  25. Integercount=(Integer)context.getAttribute("counter");
  26. if(null==count){
  27. count=1;
  28. }else{
  29. count++;
  30. }
  31. context.setAttribute("counter",count);
  32. returnSUCCESS;
  33. }else{
  34. returnERROR;
  35. }
  36. }
  37. @Override
  38. publicvoidsetServletRequest(HttpServletRequestrequest){
  39. //TODOAuto-generatedmethodstub
  40. this.request=request;
  41. }
  42. @Override
  43. publicvoidsetServletContext(ServletContextcontext){
  44. //TODOAuto-generatedmethodstub
  45. this.context=context;
  46. }
  47. }

其他同上!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值