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页面,内容为:
第三步:编写User类,内容为:
第四步:编写UserAction类,内容为:
第五步:配置struts.xml文件,内容为:
第六步:发布工程,运行login.jsp,输入用户名"zhangsan"和密码"123",验证结果!
如果用户登录成功,则说明接收到了数据,否则就是没有接收到!!!
<2>.第二种接收数据方式:使用ModelDriven action(username和password名称必须与bean里面的对应)
--ModelDriven接口只有一个方法public T getModel()
--用此方法时,登陆页面不能写成user.username和user,password了
在第一步的情况下,只需要把login.jsp页面改成:
把UserAction改为:
其他同上!!!
<3>.第三种接收数据方式:使用action属性接受用户输入(username和password名称必须与bean里面的对应)
--此种方法使用时不需要写一个javabean了,就是可以删除User类了,登陆页面也不要写成user.username了,只需要把User类中的内容写到UserAction中就可以了,
UserAction中的内容为:
其他同上!!!
四.访问request,session,application对象
1.与servletAPI解耦的访问方式
<1>.通过ActionContext访问
login.jsp页面内容为:
User类内容为:
UserAction类内容为:
success.jsp内容为:
<2>实现RequestAware,SessionAware,ApplicationAware接口,让Struts2框架在运行时向Action实例注入request,session,application对象。
UserAction类内容为:
其他同上!!!
其他同上!!!
一.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页面,内容为:
- <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
- <%@taglibprefix="s"uri="/struts-tags"%>
- <%
- Stringpath=request.getContextPath();
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <basehref="<%=basePath%>">
- <title>MyJSP'login.jsp'startingpage</title>
- <metahttp-equiv="pragma"content="no-cache">
- <metahttp-equiv="cache-control"content="no-cache">
- <metahttp-equiv="expires"content="0">
- <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
- <metahttp-equiv="description"content="Thisismypage">
- <!--
- <linkrel="stylesheet"type="text/css"href="styles.css">
- -->
- </head>
- <body>
- <s:formmethod="post"action="/struts2/login">
- <s:textfieldname="user.username"label="用户名"></s:textfield>
- <s:passwordname="user.password"label="密码"></s:password>
- <s:submitname="submit"value="登录"></s:submit>
- </s:form>
- </body>
- </html>
第三步:编写User类,内容为:
- packageapp.neusoft;
- publicclassUser{
- privateStringusername;
- privateStringpassword;
- privateintage;
- publicUser(Stringusername,Stringpassword,intage){
- super();
- this.username=username;
- this.password=password;
- this.age=age;
- }
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- publicUser(){
- super();
- }
- }
第四步:编写UserAction类,内容为:
- packageapp.neusoft;
- importcom.opensymphony.xwork2.ActionSupport;
- publicclassUserActionextendsActionSupport{
- privateUseruser;
- publicUsergetUser(){
- returnuser;
- }
- publicvoidsetUser(Useruser){
- this.user=user;
- }
- publicStringexecute(){
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- }
第五步:配置struts.xml文件,内容为:
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPEstrutsPUBLIC
- "-//ApacheSoftwareFoundation//DTDStrutsConfiguration2.0//EN"
- "http://struts.apache.org/dtds/struts-2.0.dtd">
- <struts>
- <constantname="struts.enable.DynamicMethodInvocation"value="false"/>
- <constantname="struts.devMode"value="false"/>
- <includefile="example.xml"/>
- <packagename="STRUTS"namespace="/struts2"extends="struts-default">
- <actionname="login"class="app.neusoft.UserAction">
- <result>/success.jsp</result>
- </action>
- </package>
- </struts>
第六步:发布工程,运行login.jsp,输入用户名"zhangsan"和密码"123",验证结果!
如果用户登录成功,则说明接收到了数据,否则就是没有接收到!!!
<2>.第二种接收数据方式:使用ModelDriven action(username和password名称必须与bean里面的对应)
--ModelDriven接口只有一个方法public T getModel()
--用此方法时,登陆页面不能写成user.username和user,password了
在第一步的情况下,只需要把login.jsp页面改成:
- <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
- <%@taglibprefix="s"uri="/struts-tags"%>
- <%
- Stringpath=request.getContextPath();
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <basehref="<%=basePath%>">
- <title>MyJSP'login.jsp'startingpage</title>
- <metahttp-equiv="pragma"content="no-cache">
- <metahttp-equiv="cache-control"content="no-cache">
- <metahttp-equiv="expires"content="0">
- <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
- <metahttp-equiv="description"content="Thisismypage">
- <!--
- <linkrel="stylesheet"type="text/css"href="styles.css">
- -->
- </head>
- <body>
- <s:formmethod="post"action="/struts2/login">
- <s:textfieldname="username"label="用户名"></s:textfield>
- <s:passwordname="password"label="密码"></s:password>
- <s:submitname="submit"value="登录"></s:submit>
- </s:form>
- </body>
- </html>
把UserAction改为:
- packageapp.neusoft;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupportimplementsModelDriven{
- privateUseruser=newUser();
- publicUsergetModel(){
- //TODOAuto-generatedmethodstub
- returnuser;
- }
- publicStringexecute(){
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- }
其他同上!!!
<3>.第三种接收数据方式:使用action属性接受用户输入(username和password名称必须与bean里面的对应)
--此种方法使用时不需要写一个javabean了,就是可以删除User类了,登陆页面也不要写成user.username了,只需要把User类中的内容写到UserAction中就可以了,
UserAction中的内容为:
- packageapp.neusoft;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupport{
- privateStringusername;
- privateStringpassword;
- privateintage;
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- publicStringexecute(){
- if(username.equals("zhangsan")
- &&password.equals("123")){
- System.out.print("登陆成功!!!");
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- }
其他同上!!!
四.访问request,session,application对象
1.与servletAPI解耦的访问方式
<1>.通过ActionContext访问
login.jsp页面内容为:
- <%@pagelanguage="java"import="java.util.*"pageEncoding="GB18030"%>
- <%@taglibprefix="s"uri="/struts-tags"%>
- <%
- Stringpath=request.getContextPath();
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <basehref="<%=basePath%>">
- <title>MyJSP'login.jsp'startingpage</title>
- <metahttp-equiv="pragma"content="no-cache">
- <metahttp-equiv="cache-control"content="no-cache">
- <metahttp-equiv="expires"content="0">
- <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
- <metahttp-equiv="description"content="Thisismypage">
- <!--
- <linkrel="stylesheet"type="text/css"href="styles.css">
- -->
- </head>
- <body>
- <s:formmethod="post"action="/struts2/login">
- <s:textfieldname="username"label="用户名"></s:textfield>
- <s:passwordname="password"label="密码"></s:password>
- <s:submitname="submit"value="登录"></s:submit>
- </s:form>
- </body>
- </html>
User类内容为:
- packageapp.neusoft;
- publicclassUser{
- privateStringusername;
- privateStringpassword;
- privateintage;
- publicStringgetUsername(){
- returnusername;
- }
- publicvoidsetUsername(Stringusername){
- this.username=username;
- }
- publicStringgetPassword(){
- returnpassword;
- }
- publicvoidsetPassword(Stringpassword){
- this.password=password;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- }
UserAction类内容为:
- packageapp.neusoft;
- importjava.util.Map;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupportimplementsModelDriven{
- privateUseruser=newUser();
- publicUsergetModel(){
- //TODOAuto-generatedmethodstub
- returnuser;
- }
- publicStringexecute(){
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- ActionContextctx=ActionContext.getContext();
- Maprequest=(Map)ctx.get("request");
- Mapsession=ctx.getSession();
- Mapapplication=ctx.getApplication();
- request.put("message","欢迎来到程序员之家!");
- session.put("user",user);
- Integercount=(Integer)application.get("counter");
- if(null==count){
- count=1;
- }else{
- count++;
- }
- application.put("counter",count);
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- }
success.jsp内容为:
- <%@pagelanguage="java"import="java.util.*,app.neusoft.*"pageEncoding="GB18030"%>
- <%
- Stringpath=request.getContextPath();
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
- %>
- <!DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
- <html>
- <head>
- <basehref="<%=basePath%>">
- <title>MyJSP'success.jsp'startingpage</title>
- <metahttp-equiv="pragma"content="no-cache">
- <metahttp-equiv="cache-control"content="no-cache">
- <metahttp-equiv="expires"content="0">
- <metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
- <metahttp-equiv="description"content="Thisismypage">
- <!--
- <linkrel="stylesheet"type="text/css"href="styles.css">
- -->
- </head>
- <body>
- ${sessionScope.user.username},${requestScope.message}<br/>
- 本站的访问量为:${applicationScope.counter}
- </body>
- </html>
<2>实现RequestAware,SessionAware,ApplicationAware接口,让Struts2框架在运行时向Action实例注入request,session,application对象。
UserAction类内容为:
- packageapp.neusoft;
- importjava.util.Map;
- importorg.apache.struts2.interceptor.ApplicationAware;
- importorg.apache.struts2.interceptor.RequestAware;
- importorg.apache.struts2.interceptor.SessionAware;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupportimplementsModelDriven,
- RequestAware,SessionAware,ApplicationAware{
- privateUseruser=newUser();
- privateMaprequest;
- privateMapsession;
- privateMapapplication;
- publicUsergetModel(){
- //TODOAuto-generatedmethodstub
- returnuser;
- }
- publicStringexecute(){
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- request.put("message","欢迎来到程序员之家!");
- session.put("user",user);
- Integercount=(Integer)application.get("counter");
- if(null==count){
- count=1;
- }else{
- count++;
- }
- application.put("counter",count);
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- publicvoidsetRequest(Maprequest){
- //TODOAuto-generatedmethodstub
- this.request=request;
- }
- publicvoidsetSession(Mapsession){
- //TODOAuto-generatedmethodstub
- this.session=session;
- }
- publicvoidsetApplication(Mapapplication){
- //TODOAuto-generatedmethodstub
- this.application=application;
- }
- }
其他同上!!!
2.与servletAPI耦合的访问方式
<1>.通过ServletActionContext来获取HttpRequest和ServletContext对象
UserAction内容为:
- packageapp.neusoft;
- importjavax.servlet.ServletContext;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpSession;
- importorg.apache.struts2.ServletActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupportimplementsModelDriven{
- privateUseruser=newUser();
- publicUsergetModel(){
- //TODOAuto-generatedmethodstub
- returnuser;
- }
- publicStringexecute(){
- //ServletActionContext
- HttpServletRequestrequest=ServletActionContext.getRequest();
- HttpSessionsession=request.getSession();
- ServletContextapplication=ServletActionContext.getServletContext();
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- request.setAttribute("message","欢迎来到程序员之家!");
- session.setAttribute("user",user);
- Integercount=(Integer)application.getAttribute("counter");
- if(null==count){
- count=1;
- }else{
- count++;
- }
- application.setAttribute("counter",count);
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- }
其他同上!!!
<2>通过实现ServletAware和ServletContext接口,让Struts2框架向Action实例注入HttpRequest和ServletContext对象。
UserAction类的内容为:
- packageapp.neusoft;
- importjavax.servlet.ServletContext;
- importjavax.servlet.http.HttpServletRequest;
- importjavax.servlet.http.HttpSession;
- importorg.apache.struts2.interceptor.ServletRequestAware;
- importorg.apache.struts2.util.ServletContextAware;
- importcom.opensymphony.xwork2.ActionSupport;
- importcom.opensymphony.xwork2.ModelDriven;
- publicclassUserActionextendsActionSupportimplementsModelDriven,
- ServletRequestAware,ServletContextAware{
- privateUseruser=newUser();
- privateHttpServletRequestrequest;
- privateServletContextcontext;
- publicUsergetModel(){
- //TODOAuto-generatedmethodstub
- returnuser;
- }
- publicStringexecute(){
- HttpSessionsession=request.getSession();
- if(user.getUsername().equals("zhangsan")
- &&user.getPassword().equals("123")){
- System.out.print("登陆成功!!!");
- request.setAttribute("message","欢迎来到程序员之家!");
- session.setAttribute("user",user);
- Integercount=(Integer)context.getAttribute("counter");
- if(null==count){
- count=1;
- }else{
- count++;
- }
- context.setAttribute("counter",count);
- returnSUCCESS;
- }else{
- returnERROR;
- }
- }
- @Override
- publicvoidsetServletRequest(HttpServletRequestrequest){
- //TODOAuto-generatedmethodstub
- this.request=request;
- }
- @Override
- publicvoidsetServletContext(ServletContextcontext){
- //TODOAuto-generatedmethodstub
- this.context=context;
- }
- }
其他同上!!!