Struts2的配置 struts.xml Action详解

在学习struts的时候,我们一定要掌握struts2的工作原理。只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置。接下来我就先简单的讲解下struts2的框架工作原理:

一、struts2的工作原理

1、客户端初始化一个指向Servlet容器(例如Tomcat)的请求;
2、这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin);
3、接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper来决定这个请求是否需要调用某个Action;
4、如果ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy;
5、ActionProxy通过ConfigurationManager询问框架的配置文件,找到需要调用的Action类;
6、ActionProxy创建一个ActionInvocation的实例。
7、ActionInvocation实例使用命名模式来调用,在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。
8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果。返回结果通常是(但不总是,也可能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。在表示的过程中可以使用Struts2框架中继承的标签。在这个过程中需要涉及到ActionMapper。

二、部署一个struts2项目的一般步骤

1)在Myeclipse中创建一个web项目,并将struts2需要的jar包导入进项目中,如下图

2)在项目中的web.xml中进行配置struts2的框架,在web.xml中需要包含在<filter></filter>,在该节点下可以包含<filter-name>和<filter-mapin

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
  http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list> 

  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping> 

</web-app>

3)编写Action类
4)创建好了Action类中要对action进行配置struts.xml,注意该配置文件的位置要在src的根目录下
5)创建jsp的文件,进行测试

三、struts.xml的配置初探

先来看看struts的基本配置的大概情况

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

<struts>
  <package name="user" namespace="/" extends="struts-default">
    <action name="*user" class="com.zzjmay.action.VaildateAction" method="{1}">
      <result name="success">/success.jsp</result>
      <result name="input">/{1}.jsp</result>
    </action>
  </package>
</struts>

从上面的代码中可以看出,xml中包含的再根节点下<struts></struts>下。在实际项目中的编写时,头部信息需要更改,那么我们给以在导入的jar中的jar包中进行获取

在struts-core-2.2.1.1.jar包下的struts2.0.dtd中进行获取。

四、struts.xml中的package的配置

看着前面的代码可以很清晰的看到package的属性

属性有:

1.     name:逻辑上的包名
2.     namespace:命名空间,用来区分同意struts下的相同action(注意是一种逻辑上的的路径)
3.     extends: 继承某个配置文件
4.     abstract

具体使用过程中要注意,有与命名空间的命名,我们要在相应的过程中加上对应的命名空间的路径,例如:

<s:form action="db/login.action" method="post">

此代码说明的就是将会去调用db命名空间下的login对应的action

还需要注意的是:

<result>标签的下的是物理路径(绝对路径),即指在项目中的实际位置,代码如下

<result name="success">/login/error.jsp</result>

六、struts.xml中的result的配置

对于action的配置我这里面只是简单的概括,具体很多细节性的东西我将专门写一篇博客,主要讲解的动态的对action进行配置

属性有:

1.     name:Action类的映射名称
2.     class:Action类的完整路径
3.     method:默认使用的execute()方法,如果要自定义触发方法,需要使用method自定义

七、struts.xml配置过程中的注意信息

在实际开发的项目中,我们可能需要配置很多的action,有时候为了便于我们的分类,我们一般需要创建不同包下的struts-user.xml文件,不过最终我们的这些配置都是要导入进我们的struts.xml文件中。使用的标签和jsp编程中<include>

struts.xml

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

<struts>
  <include file="struts-user.xml"></include>
</struts>

struts-user.xml

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

<struts>
  <constant name="struts.ui.theme" value="simple"></constant>
  <package name="user" namespace="/ss" extends="struts-default">
    <action name="login" class="com.zzjmay.action.UserAction"
      method="execude2">
  <!--result下的路径是物理路径 -->
      <result name="success">/login/success.jsp</result>
      <result name="error">/login/error.jsp</result>
    </action>
  </package>
  <!-- 包名不能相同 -->
  <package name="user123" namespace="/db" extends="struts-default">
    <action name="login" class="com.zzjmay.action.UserAction"
      method="execude2">
  <!--result下的路径是物理路径 -->
      <result name="success">/login/error.jsp</result>
      <result name="error">/login/success.jsp</result>
    </action>
  </package>
</struts> 

一、Action的创建方法

1)实现Action接口
2)继承ActionSupport类,覆写其中的方法
3)不继承任何类都可以实现,关键是在struts.xml中进行配置

二、Action动态方法的调用

在实际的项目中,一个action类的中,可能存在多个方法,而不同的方法执行的效果是不一样的,如果按照了一般性的配置,将无形的增加了程序员的负担

第一种方法:在struts.xml中的action属性标签中用method属性指定方法名(不怎么推荐使用)

第二种方法: jsp页面中指定你要调用的那个方法

<form action=”login!myfun.action”,method=”post”>

在客户端请求中进行动态的配置:映射名!方法名.action

这样可以动态的调用action中的myfun方法,就不要在action标签中进行method的配置

第三种方法:使用通配符进行配置(推荐使用:适用情况当一个类中存在较多的响应方法)

在配置<action> 时,可以在 name,class,method 中使用通配符,这是 另外一种形式的动态方法调用

<action name="*user" class="com.zzjmay.action.UserAction" method="{1}">
//这种通配是针对的是同一个action中,响应不同的方法 

在jsp页面中调用的时候
<form action="loginuser.action" method="post">
  <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
    用户名:<input type="text" name="username" id="username"><br>
    密   码:<input type="password" name="password" id="password">
    <br>
    <input type="submit" value="提交"> 

  </form> 

注意:通过使用通配符的时候相当于占位操作,其中的{1}表示第一个通配符,就上面的例子来讲,当jsp页面中是loginuser.action进行调用的时候,实际上出发的Action类中的login()方法

通过通配符实现,不同的类响应不同的类中的方法:

<action name=“*_*" class="action.{1}Action" method="{2}">
  <result >/{2}.jsp</result>
</action>

三、 Action的动态结果的配置

含义:在实际运行当中,Action类的处理业务的过程中,可能由于业务条件的复杂,会跳转到不同页面,那么为了节省result的配置,我们一般会采用动态结果的配置。其实很像我们在servlet中进行全局的forward的配置。

UserAction.Java

public class UserAction extends ActionSupport {
  private String nextResult;
  ...
}

Struts2.xml

<action name="user" class="action.UserAction">
  <result>/{nextResult}</result>
</action>

四、接收用户数据(推荐使用的实现ModelDriven的接口)

在这篇博客中我只是介绍常用的,并且在实际项目中效率较高的方法。我之所以推荐ModelDriven接口的方法,原因就是可以很好的分离显示界面和业务逻辑的分离(解耦性)。

实现ModelDriven接口

步骤:
u    实现用户登录功能
u    创建User.java类
Ø          声明用户登录信息
Ø          创建无参构造
u   创建Action类
Ø          实现com.opensymphony.xwork2.ModelDriven接口
Ø          声明User类对象并实例化
Ø         实现getModel ()方法,返回User类对象
u    创建JSP页面
Ø         表单元素使用”属性”设置name属性

注意:
1)  首先,action要实现ModelDriven的接口,默认实现getModel()方法
2)  要在action中自己来实例化user的对象,而不像前面一种方法是有struts2的框架实现的
3)  比较突出的就是在jsp页面中,表单元素的name属性,直接用名字就可以来

UserAction.java

public class UserAction implements ModelDriven<User> {
  //要实例化
  private User user=new User(); 

  public User getUser() {
    return user;
  } 

  public void setUser(User user) {
    this.user = user;
  }
  public String myfun() throws Exception {
    System.out.println("username="+user.getUsername());
    System.out.println("password="+user.getPassword());
    System.out.println("myfun.....");
    //用来进行处理
    if(user.getUsername().equals(user.getPassword())){
      return "success";
    }else{
      return "error";
    } 

  } 

  public User getModel() {
    // TODO Auto-generated method stub
    return user;
  } 

}

login.jsp

<form action="loginuser.action" method="post">
  <!-- 需要注意的是要保证表单中的name的命名要和Action中属性的命名保持一致 -->
    用户名:<input type="text" name="username" id="username"><br>
    密   码:<input type="password" name="password" id="password">
    <br>
    <input type="submit" value="提交"> 

  </form> 

五、在Action中访问Servlet API

访问Servlet API的实际项目中有两种的方法访问Servlet API

1)解耦的方法(实现三大接口程序RequestAware,ApplicationAware,SessionAware)

public class UserAction2 implements ModelDriven<User> ,RequestAware,SessionAware,ApplicationAware{ 

  private User user = new User(); 

  private Map<String, Object> requestMap;
  private Map<String, Object> sessionMap;
  private Map<String, Object> applicationMap; 

  public void setApplication(Map<String, Object> applicationMap) {
    this.applicationMap=applicationMap; 

  } 

  public void setSession(Map<String, Object> sessionMap) {
    this.sessionMap=sessionMap;
  } 

  public void setRequest(Map<String, Object> requestMap) {
      this.requestMap=requestMap; 

  } 

  public User getUser() {
    return user;
  } 

  public void setUser(User user) {
    this.user = user;
  } 

  public String myfun() throws Exception {
    System.out.println("username=" + user.getUsername());
    System.out.println("password=" + user.getPassword());
    System.out.println("myfun2.....");
    // 用来进行处理
    if (user.getUsername().equals(user.getPassword())) { 

      sessionMap.put("Succ", "成功的哇2!!!");
      Bookbiz bookbiz=new Bookbiz(); 

      applicationMap.put("books",bookbiz.getBooks()); 

      return "success";
    } else { 

      requestMap.put("errorMsg", "登陆失败了2");
      return "error";
    } 

  } 

  public User getModel() {
    // TODO Auto-generated method stub
    return user;
  }

注意:在非解耦的方式中,struts2框架已经将对应的四大应用作用域给封装到了Map集合中,所以这里一开始定义的三个Map集合中可以相当于操作四大作用域对象

2)非解耦的方法(实现两大接口程序ServletReuqestAware,ServletContextAware):非解耦的意思就是说直接操作的Servlet API对象

public class UserAction4 implements ModelDriven<User>,ServletRequestAware,ServletContextAware{ 

  private User user = new User(); 

  private HttpServletRequest request;
  private HttpSession session;
  private ServletContext application; 

  public void setServletContext(ServletContext application) {
    this.application = application; 

  } 

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

  } 

  public User getUser() {
    return user;
  } 

  public void setUser(User user) {
    this.user = user;
  }
………………

注意:在实现接口中只实现了request和application的获取

在实际项目开发当中,需要的获取session的方法是通过Httpsession session= request.getsession();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • struts2+jquery实现ajax登陆实例详解

    文本仪一个实例讲述了struts2+jquery实现ajax登陆的实现方法,具体步骤如下: 一.新建一个web项目,取名test.配置好struts2的环境,并导入Jquery的js文件到该项目. 二.在com.action包下,新建一个loginAction.java loginAction.java的代码如下 package com.action; import org.apache.struts2.convention.annotation.Action; import org.apach

  • struts升级到2.5.2遇到的问题及解决方案(推荐)

    原来的版本是2.3.x,由于安全原因需要升级到2.5.2. 1,2.5.2版本不再提供xwork.jar ,整合到了 struts-core包中. 2,方法不能访问的问题,需要在每个action配置文件中加上 strict-method-invocation="false": <package name="login" namespace="/login" extends="struts-default" strict-

  • 如何用struts调用支付宝接口

    一.ACTION类关键代码 没用的包可以干掉 复制代码 代码如下: package com.hzdracom.alipay.action; import it.sauronsoftware.base64.Base64; import java.io.IOException;import java.io.PrintWriter;import java.net.HttpURLConnection;import java.util.HashMap;import java.util.Map;import

  • Struts2的s:radio标签使用及用jquery添加change事件

    struts2中s:radio标签的使用总结 遇到的问题:在使用该标签时,设置了默认选中项,但提交数据返回后,单选框不能显示之前选中的项,仍然为默认选项 通过测试得出以下结论: 以<s:radio name="user.sex" list="%{#{'1':'男','0':'女'}}" theme="simple"></s:radio>为例 在使用s:radio标签的时候,如果要使该标签默认选中一项,可以通过两种方法 1.

  • struts2+spring+hibernate分页代码[比较多]第1/7页

    dao层接口: Java代码 复制代码 代码如下: package com.last999.im.news.dao; import java.util.*; import com.last999.im.news.entity.KindEntity; import com.last999.im.news.web.PageTool; public interface KindEntityDao{ public KindEntity get(String uuid); public void save

  • Struts2的配置 struts.xml Action详解

    在学习struts的时候,我们一定要掌握struts2的工作原理.只有当我们明确了在struts2框架的内部架构的实现过程,在配置整个struts 的框架时,可以很好的进行逻辑上的配置.接下来我就先简单的讲解下struts2的框架工作原理: 一.struts2的工作原理 1.客户端初始化一个指向Servlet容器(例如Tomcat)的请求: 2.这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,这个过滤器对于Struts2和其

  • 使用idea创建web框架和配置struts的方法详解

    如何用idea创建web框架和配置struts 创建好一个project右键project,选择第二项 选中Web Application,然后点击OK 创建文件夹名为lib(用来存放jar包)和classes(用来存放输出文件) 在官网下载struts,把jar放入lib中,然后右键lib,选择 add as library(导入成功) 点击file-project structure-modules-path 把两个路径都改为web文件夹下面的classes(刚创建的) 总结 到此这篇关于使

  • struts2配置静态资源代码详解

    Struts2框架有两个核心配置文件:struts.xml和Struts2默认属性文件default.properties(在struts2-core-2.3.20.jar中) default.properties可以通过自己在classpath下写一个struts.properties文件进行定制改写 为什么是struts.properties,这可以看org.apache.struts2.config下的DefaultSettings和PropertiesSettings源码 Default

  • struts2入门(搭建环境、配置、示例)详解

    在慕课网学习struts2入门课程,在官网下载的最新的struts-2.5.5-all.zip,JDK使用的是jdk1.6,Tomcat9.0,一直报错[java.lang.UnsupportedClassVersionError],版本不一致,可是各种换版本也都不好使,无奈最后找到了一篇较新的博文,按照他的Struts2版本进行了配置,终于可以用了. ------不过还是不太明白为啥struts-2.5.5无论是配jdk1.6还是jdk1.8,还是更换tomcat版本,都不好用.有明白清楚的还

  • Struts2.5版本struts.xml与web.xml配置的更改方法

    前言 升级之后的strut2技能总是会有点变化的,但是别忘记配置struts.xml与web.xml,下面话不多说了,来一起看看详细的介绍吧 1.web.xml核心过滤器的修改 <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class&

  • Struts2和Ajax数据交互示例详解

    前言 我们从Web 2.0的随波逐流,Ajax的大放异彩说起,Struts2框架自己整合了对Ajax的原生支持(struts 2.1.7+,之前的版本可以通过插件实现),框架的整合只是使得JSON的创建变得异常简单,并且可以简单的融入到Struts2框架中,当然这只是在我们需要JSON的时候才会显得流光溢彩. ajax请求在项目中常常使用,今天就平时掌握的总结一下,关于使用ajax请求到Struts2中的action时,前台页面与后台action之间的数据传递交互问题. 这里我主要记录下自己所掌

  • Java struts2请求源码分析案例详解

    Struts2是Struts社区和WebWork社区的共同成果,我们甚至可以说,Struts2是WebWork的升级版,他采用的正是WebWork的核心,所以,Struts2并不是一个不成熟的产品,相反,构建在WebWork基础之上的Struts2是一个运行稳定.性能优异.设计成熟的WEB框架. 我这里的struts2源码是从官网下载的一个最新的struts-2.3.15.1-src.zip,将其解压即可.里面的目录页文件非常的多,我们只需要定位到struts-2.3.15.1\src\core

  • 基于Tomcat安全配置与性能优化详解

    Tomcat 是 Apache软件基金会下的一个免费.开源的WEB应用服务器,它可以运行在 Linux 和 Windows 等多个平台上,由于其性能稳定.扩展性好.免费等特点深受广大用户喜爱.目前,很多互联网应用和企业应用都部署在 Tomcat 服务器上,比如我们公司,哈. 之前我们 tomcat 都采用的是默认的配置,因此在安全方面还是有所隐患的.上周对测试环境的所有服务器的tomcat都做了安全优化,其间也粗略做了一些性能优化,这里就简单记录分享下! 一.版本安全 升级当前的tomcat版本

  • Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观.它被设计用来传输和存储数据,其焦点是数据的内容.那么Python是如何处理XML语言文件的呢?下面一起来看看Python常用内置模块之xml模块吧. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.在使用ElementTre

  • Android 中Manifest.xml文件详解

    Android 中Manifest.xml文件详解 每一个Android项目都包含一个清单(Manifest)文件--AndroidManifest.xml,它存储在项目层次中的最底层.清单可以定义应用程序及其组件的结构和元数据. 它包含了组成应用程序的每一个组件(活动.服务.内容提供器和广播接收器)的节点,并使用Intent过滤器和权限来确定这些组件之间以及这些组件和其他应用程序是如何交互的. 它还提供了各种属性来详细地说明应用程序的元数据(如它的图标或者主题)以及额外的可用来进行安全设置和单

随机推荐