`

Struts2中一些零碎的知识点

阅读更多
http://cache.baidu.com/c?m=9d78d513d98207ef1fabd5690c66d7711925c2236b9583552c84cd1f87231b1f483ca5fd65351177ced8393c5de9021dfdf0412a644773e0d09f9f4aaaeacf7732d879692501804b11d71aae&p=c66dc64ad78211a059eccc235b44&user=baidu

[原]Struts2-深入探索
[标题]:[原]Struts2-深入探索
[时间]:2009-8-26

[摘要]:Struts2中一些零碎的知识点:struts.xml详解、模型驱动、Preparable接口、防止表单重复提交、ActionContext、动态方法调用、异常
[关键字]:浪曦视频,Struts2应用开发系列,WebWork,Apache,深入探索
[环境]:struts-2.1.6、JDK6、MyEclipse7、Tomcat6
[作者]:Winty (wintys@gmail.com) http://www.blogjava.net/wintys

[正文]:
1、struts.xml详解
a. struts.properties
             在struts.xml中可以定义constant覆盖struts-core.jar/org/apache/struts2/default.properties中的设置。
       例:<constant name="struts.custom.i18n.resources" value="message"/>

       也可以直接新建struts.properties (与struts.xml在同一目录),在struts.properties中配置。推荐在struts.properties中进行配置。
       例:struts.custom.i18n.resources = message

b. abstract package
       struts-core.jar/struts-default.xml,中有如下定义。
       <package name="struts-default" abstract="true" >
              ......
       </package>
       其中abstract="true"中,表示在此package中不能定义Action(与Java abstract类相似),仅供继承。

c. namespace
       strut.xml中:
       <package name="MyStruts" extends="struts-default" namespace ="/ mystruts">
       ......
       </package>

       默认命名空间为namespace="",命名空间要以"/"开头。
       JSP访问:<s:form action="miscellaneous" namespace="/mystruts" >。
       不能写成<s:form action="/mystruts/miscellaneous"> ,否则会发生错误:"No configuration found for the specified action: '/mystruts/miscellaneous' in namespace: '/miscellaneous'. Form action defaulting to 'action' attribute's literal value."[2]。

d. 模块化配置
       ......
       <struts>
              <include file="struts1.xml" />
              <package ...>
                     ......
              </package>
       </struts>
       include中struts1.xml的编写与struts.xml是类似的。


2、属性驱动与模型驱动
属性驱动:直接在Action中写表单属性。

/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousAction.java:


package wintys.struts2.miscellaneous;
import com.opensymphony.xwork2.ActionSupport;
/**
  *
  * @author Winty (wintys@gmail.com)
  * @version 2009-8-24
  * @see http://wintys.blogjava.net
  */
@SuppressWarnings("serial")
public class MiscellaneousAction extends ActionSupport {
       private String name;
       private String password;
       public String getName() {
              return name;
       }
       public void setName(String name) {
              this.name = name;
       }
       public String getPassword() {
              return password;
       }
       public void setPassword(String password) {
              this.password = password;
       }
      
       @Override
       public String execute() throws Exception {
              return SUCCESS;
       }
}


模型驱动:将属性放到JavaBean中,Action需要实现com.opensymphony.xwork2.ModelDriven接口。ModelDrivenInterceptor 必须在之前StaticParametersInterceptor and ParametersInterceptor。这个顺序已在defaultStack Interceptor中定义。

/StrutsHelloWorld/src/wintys/struts2/miscellaneous/User.java:

package wintys.struts2.miscellaneous;
/**
  * 模型驱动Action中的模型
  * @author Winty (wintys@gmail.com)
  * @version 2009-8-25
  * @see http://wintys.blogjava.net
  */
public class User {
       private String name;
       private String password;
       public String getName() {
              return name;
       }
       public void setName(String name) {
              this.name = name;
       }
       public String getPassword() {
              return password;
       }
       public void setPassword(String password) {
              this.password = password;
       }
}


/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousModelDrivenAction.java:

package wintys.struts2.miscellaneous;
import com.opensymphony.xwork2.ModelDriven;

@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
              ModelDriven<User>{
      
       private User user = new User();
      
       @Override
       public User getModel() {
              return user;
       }
      
       @Override
       public String execute() throws Exception {
              return SUCCESS;
       }
}


3、Preparable接口
       Action还可以实现com.opensymphony.xwork2.Preparable接口,用于准备Action自己。Preparable中的prepare方法在Action执行其它方法前执行。

4、使用simple 主题时,如何单独格式化Struts错误提示信息
       单独显示name字段的fielderror:

<s:fielderror>
       <s:param>name</s:param>
</s:fielderror>


5、Struts防止表单重复提交
       JSP页面中加入token和actionerror:
<s:actionerror />
<s:form .../>
       <s:token />
</s:form>

       token产生的actionerror的i18n key为:struts.message.invalid.token。

       在struts.xml中的Action配置中加入token interceptor,和invalid.token result:

               <action name="miscellaneous" class="wintys.struts2.miscellaneous.MiscellaneousModelDrivenAction">
                      <result name="success">/miscellaneous/output.jsp</result>
                      <result name="input">/miscellaneous/input.jsp</result>

                       <result name="invalid.token " >/miscellaneous/input.jsp</result>
                      <interceptor-ref name="token " />
                      <interceptor-ref name="defaultStack" />
               </action>


       生成的JSP页面如下:
       <input type="hidden" name="struts.token.name" value="struts.token " />
       <input type="hidden" name="struts.token " value="ORU0RZIP8JWQ7BDZG4P1NJSEKITGG6X5" />

       struts.token.name指<s:token />中的name,默认为struts.token。也可以自己指定<s:token name="mytoken" />。则生成如下token:
       <input type="hidden" name="struts.token.name" value="mytoken" />
       <input type="hidden" name="mytoken" value="GFD13EW206G2DY9AB3SRIAVXXT1S915C" />

6、通过Struts获取Servlet API
       一般Java Web程序不能离开容器进行测试。容器内测试常用框架:Cactus(jakarta.apache.org/cactus/index.html) 、Mock。

       通过Struts获取Servlet API,使程序可脱离容器测试。Struts中可通过如下方法获取Servlet API:ActionContext 、ServletActionContext、ServletXXXAware。首选ActionContext,其次选择ServletActionContext,再次ServletXXXAware。

a. ActionContext
       com.opensymphony.xwork2.ActionContext.getActionContext()获取ActionContext实例。

       ActionContext的get()和put()方法与HttpServletRequest的对应关系:
       ActionContext.get() <=> HttpServletRequest.getAttribute()
       ActionContext.put() <=> HttpServletRequest.setAttribute()

       例:

              ActionContext context = ActionContext.getContext();
              context.put("info", "this is ActionContext value");

      
       但是ActionContext无法获取Servlet HttpResponse对象。

b. ServletActionContext
       org.apache.struts2.ServletActionContext是com.opensymphony.xwork2.ActionContext的子类。

       使用静态方法直接获取Servlet对象:
       Request: ServletActionContext.getRequest();
       Response: ServletActionContext.getResponse();
       Session: ServletActionContext.getRequest().getSession();

       例:

              Cookie cookie = new Cookie("mycookie" , "10000");
              HttpServletResponse response = ServletActionContext.getResponse() ;
              response.addCookie(cookie);


c. ServletXXXAware接口
       org.apache.struts2.util.ServletContextAware接口
       org.apache.struts2.interceptor.ServletRequestAware接口
       org.apache.struts2.interceptor.ServletResponseAware接口
       org.apache.struts2.interceptor.SessionAware接口

       实现ServletXXXAware接口的Action会被Struts自动注入相应的Servlet对象。

       例:

package wintys.struts2.miscellaneous;

import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionSupport;

@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
              ServletRequestAware {
       private HttpServletRequest request;
       ......
       @Override
       public String execute() throws Exception {
              //实现ServletRequestAware接口,Struts自动注入的request
              Cookie[] cookies = this.request.getCookies();
              for(Cookie ck : cookies){
                     System.out.print("cookie:" + ck.getName());
                     System.out.println(" = " + ck.getValue());
              }

              return SUCCESS;
       }
       ......
       @Override
       public void setServletRequest (HttpServletRequest request) {
              this.request = request;
       }
}


7、动态方法调用
a. Action配置中,由method指定动态调用方法的名称。
<action name="myaction" class="com.tests.MyAction" method="myexecute ">
......
</action>

b.在JSP页面中,调用Action时加感叹号指定动态调用方法的名称。
<s:form action="myaction!myexecute " />

c.通配符
<action name="*action " class="com.tests.MyAction" method="{1} ">
则请求中helloaction对应到action中的hello()方法,以此类推。


8、异常
       发生异常时,可转到指定的result。由exception-mapping配置

<action name="miscellaneous" class="wintys.struts2.miscellaneous.MiscellaneousModelDrivenAction">
       <result name="success">/miscellaneous/output.jsp</result>
       <result name="input">/miscellaneous/input.jsp</result>
       <exception-mapping    exception="wintys.struts2.miscellaneous.NameInvalidException" result="nameInvalid" />
       <result name="nameInvalid">/miscellaneous/nameInvalidException.jsp</result>
</action>


       也可以配置全局exception mapping

<global-exception-mapping>
       <exception-mapping result="nameInvalid" />
</global-exception-mapping>


       nameInvalidException.jsp:

<s:property value="exception"/>
<s:property value="exceptionStack" />


NameInvalidException.java:

package wintys.struts2.miscellaneous;
@SuppressWarnings("serial")
public class NameInvalidException extends Exception {
       public NameInvalidException(String message) {
              super(message);
       }
}


9、详细代码
/StrutsHelloWorld/WebRoot/miscellaneous/input.jsp:

<%@ page language="java"   contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <title>Input</title>
   </head>
   <body>
         <s:actionerror/>
        
       <s:form action="miscellaneous" method="post" theme="simple" namespace="/mystruts">
              <s:token name="mytoken"/>
             
              用户名:<s:textfield name="name" />
              <s:fielderror >
                     <s:param>name</s:param>
              </s:fielderror>
              <br />
             
             
              密码:<s:textfield name="password"/>
              <s:fielderror >
                     <s:param>password</s:param>
              </s:fielderror>
              <br />
             
              <s:submit name="提   交" />
       </s:form>
      
       <hr />
       动态方法调用方法二:       miscellaneous!myexecute
       <s:form action="miscellaneous!myexecute" namespace="/mystruts">
              <s:token name="mytoken"/>
              <s:hidden name="name" value="test" />
              <s:hidden name="password" value="test" />
              <s:submit name="提交执行myexecute() " />
       </s:form>
   </body>
</html>



/StrutsHelloWorld/WebRoot/miscellaneous/output.jsp:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
   <head>
       <title>Output</title>
   </head>
   <body>
          提交结果:<br/>
       用户名:<s:property value="name"/> <br />
       密码:<s:property value="password"/> <br />
       <hr />
       ${request.info}
       ${cookie.mycookie.value }
   </body>
</html>



/StrutsHelloWorld/src/wintys/struts2/miscellaneous/MiscellaneousModelDrivenAction.java:

package wintys.struts2.miscellaneous;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
  * Struts2深入探索
  * @author Winty (wintys@gmail.com)
  * @version 2009-8-26
  * @see http://wintys.blogjava.net
  */
@SuppressWarnings("serial")
public class MiscellaneousModelDrivenAction extends ActionSupport implements
              ModelDriven<User> , ServletRequestAware {
      
       private User user = new User();
       private HttpServletRequest request;
      
       @Override
       public User getModel() {
              return user;
       }
      
       @Override
       public String execute() throws Exception {
              System.out.println("this is model driven action");
             
              if(user.getName().equals("admin")){
                     throw new NameInvalidException("name 'admin' is invalid");
              }
             
              //ActionContext.put相当于HttpServletRequest.setAttribute()
              ActionContext context = ActionContext.getContext();
              context.put("info", "this is ActionContext value");
             
              //ServletActionContext.getResponse得到Response对象
              Cookie cookie = new Cookie("mycookie" , "10000");
              HttpServletResponse response = ServletActionContext.getResponse();
              response.addCookie(cookie);
             
              //实现ServletRequestAware接口,Struts自动注入的request
              Cookie[] cookies = this.request.getCookies();
              for(Cookie ck : cookies){
                     System.out.print("cookie:" + ck.getName());
                     System.out.println(" = " + ck.getValue());
              }

              return SUCCESS;
       }
      
       public String myexecute()throws Exception{
              System.out.println("myexecute()");
             
              return SUCCESS;
       }
      
       @Override
       public void validate() {
              if(user.getName() == null || user.getName().equals("")){
                     this.addFieldError("name", "invalid name");
              }
       }

       @Override
       public void setServletRequest(HttpServletRequest request) {
              this.request = request;
       }
}



/src/struts.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
       "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
       "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>  
       <package name="MyStruts" extends="struts-default" namespace="/mystruts">
               <!-- Struts2深入探索 -->
               <action name="miscellaneous" class="wintys.struts2.miscellaneous.MiscellaneousModelDrivenAction">
                      <result name="success">/miscellaneous/output.jsp</result>
                      <result name="input">/miscellaneous/input.jsp</result>
                      <exception-mapping   exception="wintys.struts2.miscellaneous.NameInvalidException" result="nameInvalid" />
                      <result name="nameInvalid">/miscellaneous/nameInvalidException.jsp</result>
                      <result name="invalid.token" >/miscellaneous/input.jsp</result>
                      <interceptor-ref name="token" />
                      <interceptor-ref name="defaultStack" />
               </action>
       </package>
</struts>
分享到:
评论

相关推荐

    Struts2知识点

    下面是 Struts2 的一些重要知识点: 1. Struts2 的安装和设置: Struts2 的安装非常简单,只需要下载 Struts2 的 Full Distribution,解压缩到指定的目录中,然后安装 MyEclipse 和 Tomcat 即可。 2. Struts2 ...

    Struts2知识点总结

    以上是对Struts2框架基础知识点的总结,实际开发中还需要了解更多的高级特性,如自定义拦截器、动态方法调用、文件上传下载、异常处理策略等。通过这些知识,新手可以快速上手并熟练掌握Struts2框架的使用。

    struts2 知识点

    ### Struts2知识点详解 #### 一、Struts2框架概览 Struts2是Apache组织推出的一个基于Java EE的Web应用框架,它遵循MVC(Model-View-Controller)设计模式,为开发者提供了构建可扩展、易于维护的Web应用程序的...

    struts2中核心知识点(职场必备)

    以下是Struts2的一些核心知识点,掌握这些内容能够帮助你在面试中表现出色。 1. **MVC模式的优势**: MVC模式将应用程序分为三个层次:视图(View)、模型(Model)和控制器(Controller)。这种分离有利于项目...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts知识点总结

    struts知识点总结struts知识点总结,觉得有需要的就拿去看看吧

    struts2重要知识点原理

    尽管如此,Struts2在其之上增加了一些特定的特性,比如更丰富的标签库和更友好的API,使其更适合大型企业级应用。 总结起来,Struts2框架通过FilterDispatcher作为核心控制器拦截和处理用户请求,使用Action和...

    Struts2教学视频

    以上就是关于Struts2的一些基础知识点,学习Struts2不仅可以帮助理解MVC模式在实际应用中的工作原理,还能提升Java Web开发的技能。通过观看教学视频,结合实践操作,可以更好地掌握这些概念和技术。

    留言板留言板struts2留言板struts2

    下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:Struts2是Apache软件基金会下的开源项目,它继承了Struts1的优点,并融合了WebWork框架的许多特性。Struts2的主要目标是...

    struts2+hibernate+spring三大框架知识点笔记

    在介绍Struts2时,我们需要了解以下几个关键知识点: 1. **MVC模式**:MVC是一种将业务逻辑、数据和用户界面分离的设计模式,Struts2作为表现层框架,主要处理控制器(Controller)部分。 2. **Web应用的三层结构**...

    struts2+cas单点登陆例子

    总结一下,Struts2+CAS的单点登录集成涉及到的主要知识点包括:CAS的工作流程、Struts2框架的拦截器机制、Web应用的过滤器配置以及安全认证的实现。通过这个简单的示例,开发者可以学习如何在自己的项目中实施SSO,...

    struts2项目开发

    下面将从 Struts2 项目开发的角度,详细介绍 Struts2 框架的应用、开发流程、技术架构、实践经验等方面的知识点。 项目需求分析 在 Struts2 项目开发中,需求分析是非常重要的一步。通过对项目的需求分析,可以...

    共享Struts2的一些资源

    以下是对给定资源中涉及知识点的详细解释: 1. **Struts2的MVC架构**: MVC模式是软件设计中的一种经典架构,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。Struts2实现了这...

    struts2 中文手册

    该手册可能涵盖了以下几个主要知识点: 1. **配置文件**:Struts2的配置主要包括struts.xml文件,它定义了Action、拦截器和结果映射。在这个文件中,你可以指定Action类、请求路径以及处理特定请求的方法。 2. **...

    struts2面试题

    ### Struts2 面试知识点详解 #### Struts2框架概述 1. **Struts2与Servlet API的关系**:Struts2是一个基于Servlet API构建的MVC框架,它为Web应用程序提供了一种灵活的方式来组织代码。Struts2通过封装Servlet ...

    Struts2实战

    Struts2实战 知识点: 1. Struts2框架的介绍:Struts2是Struts的下一代...以上就是Struts2框架的主要知识点,通过这些知识点的介绍,我们可以了解到Struts2框架的强大功能和灵活应用,它在Java Web开发中的重要地位。

    Struts2视频教程

    ### Struts2核心知识点解析 #### 一、Struts2框架概述 - **定义与特点**:Struts2是一款基于MVC(Model-View-Controller)设计模式的Java Web应用程序框架,它继承了Struts1的优点,同时在设计上更加灵活、易用,...

Global site tag (gtag.js) - Google Analytics