struts2框架学习之工程搭建、拦截器和包

搭建工程

  1. Maven搭建web工程
    使用Maven搭建web工程有两种方法:
    ①使用命令窗口结合eclipse来创建Maven Web 项目:
    mvn archetype:create -DgroupId=com.test -DartifactId=MavenWeb -DarchetypeArtifactId=maven-archetype-webapp
    如果没有最后-DarchetypeArtifactId 则声称普通的maven项目,另外使用命令mvn eclipse:eclipse -Dwtpversion=1.0 可将maven 普通项目转换为web项目,体现在pom.xml中(需要切换到项目主目录下)。生成的web项目的结构如下:
    这里写图片描述
    之后,在Eclipse中导入已经存在的Maven Project即可。
    ②直接使用eclipse进行创建:
    在eclipse的工作空间中,右键New–>Other,在弹出的框中输入Maven,选择Maven Project,新建的项目ArtifactId选择maven-archetype-webapp即可,新建完成后,在src/main下新建源文件目录java,最终创建的项目架构如图:
    这里写图片描述

  2. 添加依赖jar包:
    修改配置文件pom.xml,增加strust2的依赖jar包,配置文件如下:

<!-- 引入strutsjar包 -->
    <dependency>  
        <groupId>org.apache.struts</groupId>  
        <artifactId>struts2-core</artifactId>  
        <version>2.3.16</version>  
     </dependency> 
        <!-- 导入oraclejar包 -->
    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>10.2.0.1.0</version>
    </dependency>
    <!-- 添加servlet依赖 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope><!-- 只提供在打包时不会增加,不写则会增加-->
    </dependency>

配置struts2环境和调试

1、配置struts2路径过滤器,所有以*.action或jsp结尾的请求会调用此过滤器,另外struts2默认的配置文件为struts-default.xml,struts-plugin.xml,struts.xml,可以从struts2的源码org.apache.struts2.dispatcher.Dispatcher类中可以看出,源码如下:

 private void init_TraditionalXmlConfigurations() {
     String configPaths = (String)this.initParams.get("config");
     if (configPaths == null) {
      configPaths = "struts-default.xml,struts-plugin.xml,struts.xml";
    }
   String[] files = configPaths.split("\\s*[,]\\s*");
     for (String file : files) {
      if (file.endsWith(".xml")) {
         if ("xwork.xml".equals(file)) {
          this.configurationManager.addContainerProvider(createXmlConfigurationProvider(file, false));
         } else {
          this.configurationManager.addContainerProvider(createStrutsXmlConfigurationProvider(file, false, this.servletContext));
         }
       } else {
         throw new IllegalArgumentException("Invalid configuration file name");
      }
     }
   }

因此,如果需要改变struts2默认的配置文件,需要在web.xml中传递参数名称为config的参数,参数值以”,”分割,如下web.xml配置文件中配置的struts2文件为struts-default.xml,struts-plugin.xml,struts-config.xml。因此只需要在src/main/java(源目录)目录下新建struts-config.xml即可,详细的配置文件如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  <!-- 配置struts2过滤器 -->
  <filter>
    <filter-name>Struts2Filter</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    <!-- 默认的strus2配置文件为struts-default.xml,struts-plugin.xml,struts.xml,使用init-param可以更改配置文件-->
    <init-param>
        <param-name>config</param-name>
        <param-value>struts-default.xml,struts-plugin.xml,struts-config.xml</param-value>
    </init-param>
  </filter>
  <!-- 当请求路径为action或者jsp结尾,则进行strust2过滤 -->
  <filter-mapping>
    <filter-name>Struts2Filter</filter-name>
    <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>Struts2Filter</filter-name>
    <url-pattern>*.jsp</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2、配置struts-config.xml文件,初始的配置文件如下:

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

</struts>

3、进行简单的登录验证,验证struts功能的完整,在源目录下新建package:com.struts.service,新建LoginService类,提供username和password属性以及对应的setter、getter方法,另外对于struts2框架调用的默认方法为public String execute(),因此在改类中新建此方法,此方法的返回值会在struts-config.xml中配置,以便进行后续的转发或者重定向操作。
4、新建login.jsp文件,如下所示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用户登录</title>
</head>
<body>
    <form action="login.action" method="post">
        用户名:<input type="text" name="username"><br/>
        密&nbsp;&nbsp;码:<input type="password" name="password"/><br/>
        <input type="submit" value="登录"/>
    </form>

</body>
</html>

form表单的action为login.action,则进行提交后会进行struts2过滤器的调用,此action在struts-config的配置文件中进行配置。
5、struts-config.xml配置文件如下,其中action标签配置的name为form表单配置的action名称:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 登录所实现的包 -->
    <package name="login"  namespace="/" extends="struts-default">
        <action name="login" class="com.struts.service.LoginService">
            <result name="success">/ok.jsp</result>
        </action>
    </package>
</struts>

6、另外根据配置文件需要新建ok.jsp文件进行登录后的跳转。
7、进行登录后,form表单的username和password属性值自动封装到LoginService中的username和password中,这是因为在strusts发起请求到响应中间是经过拦截器处理,调用的struts-default.xml的拦截器。默认的拦截器如下:

 <interceptor-stack name="defaultStack">
  <interceptor-ref name="exception" /> 
  <interceptor-ref name="alias" /> 
  <interceptor-ref name="servletConfig" /> 
  <interceptor-ref name="i18n" /> 
  <interceptor-ref name="prepare" /> 
  <interceptor-ref name="chain" /> 
  <interceptor-ref name="scopedModelDriven" /> 
  <interceptor-ref name="modelDriven" /> 
  <interceptor-ref name="fileUpload" /> 
  <interceptor-ref name="checkbox" /> 
  <interceptor-ref name="multiselect" /> 
  <interceptor-ref name="staticParams" /> 
  <interceptor-ref name="actionMappingParams" /> 
- <interceptor-ref name="params">
  <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param> 
  </interceptor-ref>
  <interceptor-ref name="conversionError" /> 
- <interceptor-ref name="validation">
  <param name="excludeMethods">input,back,cancel,browse</param> 
  </interceptor-ref>
- <interceptor-ref name="workflow">
  <param name="excludeMethods">input,back,cancel,browse</param> 
  </interceptor-ref>
  <interceptor-ref name="debugging" /> 
  <interceptor-ref name="deprecation" /> 
  </interceptor-stack>

自定义拦截器

1、自定义拦截器需要继承AbstractInterceptor并实现其interceptor()方法,在源目录下新建包:com.struts.interceptor并新建拦截器MyInterceptor,代码如下:

package com.struts.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

/**
 * @TODO 自定义拦截器,需要继承AbstractInterceptor,并实现interceprot()方法
 * @author Administrator
 * @date 2015年6月23日 下午10:34:12
 * @version 1.0
 */
public class MyInterceptor extends AbstractInterceptor {

    /* 
     * 实现其抽象方法
     */
    @Override
    public String intercept(ActionInvocation invoke) throws Exception {
        String result = invoke.invoke();
        System.out.println(result+":" + invoke.getResult() + ":" + invoke.getResultCode());
        return result;
    }
}

其中invoke.invoke()方法返回值为Service处理后的值。
2、拦截器的配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 登录所实现的包 -->
    <package name="login" extends="struts-default">
        <interceptors>
            <!--自定义拦截器 -->
            <interceptor name="myInterceptor" class="com.struts.interceptor.MyInterceptor"/>
        </interceptors>
        <action name="login" class="com.struts.service.LoginService">
            <result name="success">/ok.jsp</result>
            <interceptor-ref name="myInterceptor"/><!-- 自定义的拦截器,没有下面配置的defaultStack则前台页面的属性不会自动封装导致传递值内容为空 -->
            <interceptor-ref name="defaultStack"/><!-- 默认的拦截器栈 -->
        </action>
    </package>
</struts>

这样需要在每个action下进行配置,可以配置默认的拦截器,这样不需要每次action进行配置,只针对同包下的action起作用。
配置默认的拦截器栈:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <!-- 登录所实现的包 -->
    <package name="login" namespace="/" extends="struts-default">
        <interceptors>
            <!--自定义拦截器 -->
            <interceptor name="myInterceptor" class="com.struts.interceptor.MyInterceptor"/>
            <interceptor-stack name="myInterceptorStack">
                <interceptor-ref name="myInterceptor"/>
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
        </interceptors>
        <!-- 配置默认的拦截器栈,这样包下的action都会经过此拦截器,不需要每个action都配置-->
        <default-interceptor-ref name="myInterceptorStack"/>
        <action name="login" class="com.struts.service.LoginService">
            <result name="success">/ok.jsp</result>
            <!-- <interceptor-ref name="myInterceptor"/>自定义的拦截器,没有下面配置的defaultStack则前台页面的属性不会自动封装导致传递值内容为空
            <interceptor-ref name="defaultStack"/>默认的拦截器栈 -->
        </action>
    </package>
</struts>

包和命名空间

1、包的命名空间:解决action的名称相同的问题,在同一个命名空间下的action的名称是不允许相同的,不同命名空间下的action的名称是可以相同的。
2、url请求路径的组成:http://ip:端口/项目名称/包的命名空间/action名称。
3.action名称的搜索顺序:
例如,请求路径为 :
http://localhost:8080/struts/path1/path2/login.action
则action名称的搜索路径为:
首先,寻找namespace为/path1/path2的package,如果存在则寻找名称为login的action,有则处理,无则到默认namespace下的package进行action的查找,如果没有则页面提示错误;
其次。如果不存在/path1/path2的包,则寻找/path1的包,如果存在则寻找名称为login的action,有则处理,无则到默认namespace下的package进行action的查找,如果没有则页面提示错误;
最后。如果不存在/path1的包,则寻找namespace为/的命名空间,如果存在则寻找名称为login的action,有则处理,无则到默认namespace下的package进行action的查找,如果没有则页面提示错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值