struts2在web中当作前端控制器,接收来自页面的请求,使用过滤器拦截模式对请求进行拦截并交给相应配置的action类处理。

所以在web中使用最重要的是struts2的核心过滤器StrutsPrepareAndExecuteFilter,需要配置在main/webapp/WEB-INF/web.xml中具体配置如下

 <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>/*</url-pattern>
</filter-mapping>

filterclass是struts2提供的一个过滤器,前面已经提到是基于类(class)拦截的,所以与springmvc不同,springmvc是基于方法(method)拦截的。换种更加直观的说法来说:struts2的filter拦截 在你每提交一个request时它为你创建一个相应的Class,其中Class即是编写的Action ,而springmvc基于方法 即每次request只会被Method拦截不需要重复Class。这也是为什么在struts2和spring整合中struts的Action必须是Prototype(原型)的原因,关乎线程安全,每次spring需要为Action创建不同的Bean供请求处理。  struts的配置:

配置文件应当放在classpath下

struts.xml  配置有关struts的:

这里想说一下 struts.xml中action中各参数 name=“UserAction_* 其中_* 是配合 method="{1}"一起使用的 代表进入_后面那个方法 如 UserAction_login 就是进入login方法 class必须是完整的类名,当然如果交给spring管理可以配置为spring的bean 名

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<!--下面这个配置只有在与spring整合才会使用 否则不用加-->
<!--<constant name="struts.objectFactory" value="spring" />-->
<!--说明: name 用于在有多个struts配置文件时彼此区分 namespace:‘/’代表根目录 配置意义是本配置文件中包含的Action及其他配置 不影响其他namespace下的Action等(这代表你可以在另一个strut2.xml配置中namespace=‘/one’下配置同名的action)
  extends :struts-default 是必须配置的 也可以extends自己的 但是很麻烦通常不要那样干
  -->
<package name="dabai1" namespace="/" extends="struts-default">
<!-- 注册拦截器 拦截器栈 设置默认拦截器 -->
<interceptors>
<interceptor name="loginInterceptor"
class="com.dabai.mall.filter.LoginInterceptor"></interceptor>
<interceptor-stack name="loginStack">
<interceptor-ref name="loginInterceptor">
<!--excludeMethods 指定某些方法不做拦截 很好理解 -->
<param name="excludeMethods">login,register,read</param>
</interceptor-ref>
<!--defaultStack: 是struts内置的众多拦截器 下面会有说明-->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- <default-action-ref name="loginStack"></default-action-ref> -->
<!-- 设置全局结果集 -->
<global-results>
<result name="toLogin" type="redirect">/login.jsp</result>
</global-results>
<global-exception-mappings>
<exception-mapping result="asd" exception="asd">/error.jsp
</exception-mapping>
</global-exception-mappings>
<!-- 由于配置了struts.object value=spring -->
<action name="userAction_*" class="com.dabai.mall.action.UserAction" method="{1}" scope="prototype">
<!--这个login对应下面UserAction中return 的LOGIN 即对这个Action返回值="login"的请求 跳转到页面/login.jsp下 默认跳转方式是dispatcher 转发 可以在 name后配置 type=“redirect” 重定向
还可以在Action中跳转 action中的跳转有的方式会丢失传递参数有的则不会 具体可以参考后面关于struts的内容-->
<result name="login">/login.jsp</result>
</action>
</package>
</struts>

struts的默认拦截器栈及各个说明  可以只作了解 因为需要拦截器可以自己编写 通常会继承一个MethodFilterInterceptor类然后覆写其protected String  doIntercept(ActionInvocation arg0)方法需要注意的是filter放行需要逐个放行,只有前一个filter进行了arg0.invoke()下一个拦截器才能开始工作相当于原生的chain.dofilter()

拦截器

名字

说明

Alias Interceptor

alias

在不同请求之间将请求参数在不同名字件转换,请求内容不变

Chaining Interceptor

chain

让前一个Action的属性可以被后一个Action访问,现在和chain类型的result(<result type=”chain”>)结合使用。

Checkbox Interceptor

checkbox

添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

Cookies Interceptor

cookies

使用配置的name,value来是指cookies

Conversion Error Interceptor

conversionError

将错误从ActionContext中添加到Action的属性字段中。

Create Session Interceptor

createSession

自动的创建HttpSession,用来为需要使用到HttpSession的拦截器服务。

Debugging Interceptor

debugging

提供不同的调试用的页面来展现内部的数据状况。

Execute and Wait Interceptor

execAndWait

在后台执行Action,同时将用户带到一个中间的等待页面。

Exception Interceptor

exception

将异常定位到一个画面

File Upload Interceptor

fileUpload

提供文件上传功能

I18n Interceptor

i18n

记录用户选择的locale

Logger Interceptor

logger

输出Action的名字

Message Store Interceptor

store

存储或者访问实现ValidationAware接口的Action类出现的消息,错误,字段错误等。

Model Driven Interceptor

model-driven

如果一个类实现了ModelDriven,将getModel得到的结果放在Value Stack中。

Scoped Model Driven

scoped-model-driven

如果一个Action实现了ScopedModelDriven,则这个拦截器会从相应的Scope中取出model调用Action的setModel方法将其放入Action内部。

Parameters Interceptor

params

将请求中的参数设置到Action中去。

Prepare Interceptor

prepare

如果Acton实现了Preparable,则该拦截器调用Action类的prepare方法。

Scope Interceptor

scope

将Action状态存入session和application的简单方法。

Servlet Config Interceptor

servletConfig

提供访问HttpServletRequest和HttpServletResponse的方法,以Map的方式访问。

Static Parameters Interceptor

staticParams

从struts.xml文件中将<action>中的<param>中的内容设置到对应的Action中。

Roles Interceptor

roles

确定用户是否具有JAAS指定的Role,否则不予执行。

Timer Interceptor

timer

输出Action执行的时间

Token Interceptor

token

通过Token来避免双击

Token Session Interceptor

tokenSession

和Token Interceptor一样,不过双击的时候把请求的数据存储在Session中

Validation Interceptor

validation

使用action-validation.xml文件中定义的内容校验提交的数据。

Workflow Interceptor

workflow

调用Action的validate方法,一旦有错误返回,重新定位到INPUT画面

Parameter Filter Interceptor

N/A

从参数列表中删除不必要的参数

Profiling Interceptor

profiling

通过参数激活profile

下面是一个简单的自定义filter也是上述struts.xml中 com.dabai.mall.filter.LoginInterceptor这个类

public class LoginInterceptor extends MethodFilterInterceptor {

@Override
protected String doIntercept(ActionInvocation arg0) throws Exception {

User loginU=(User) ServletActionContext.getRequest().getSession().getAttribute("loginUser");
if(loginU==null){
return "login";
}

//拦截的业务功能记得在放行前进行!
return arg0.invoke();
}

}

下面再介绍一下Actio类

在编写struts的Acton类时可以选择实现Action接口 也可以继承ActionSupport类事实上ActionSupport类已经实现了Action接口 而且便于使用 这里建议继承自ActionSupport类 然后再实现一个ModelDriven<T>接口,因为方便,modelDriven的源码:

什么用途呢 就是getModel()用少写一个方法而已 但是却有一个好处  可以省得自己忘记写get方法。要知道前台传给后台数据转换时是通过属性驱动来进行的。下面是一个简单的Action

public Class UserAction extends ActionSupport implements ModelDriven<User>{
protected User user;
@Override
public User getUserel() {
return this.user;
}
public String login() {
System.out.println("userAction:-----");
//此处作业务逻辑处理
//这个LOGIN是Action接口中定义的静态常量等同于小写的字符串 便于实现struts.xml进行
//结果映射处理
return LOGIN;
} }

  在url中输入localhost:8080/UserAction_login  就能进入login方法中 如果成功可在控制台看到打印了:userAction:-----  若是配置了页面‘login.jsp'页面会进行跳转

有关的jar包

tomcat包已经在运行环境中

struts2的基本使用的更多相关文章

  1. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  2. 菜鸟学Struts2——Interceptors

    昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...

  3. 菜鸟学Struts2——零配置(Convention )

    又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...

  4. 菜鸟学Struts2——Results

    在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...

  5. 菜鸟学Struts2——Actions

    在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...

  6. 菜鸟学Struts2——Struts工作原理

    在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...

  7. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  8. 12、Struts2表单重复提交

    什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...

  9. 11、Struts2 的文件上传和下载

    文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...

  10. 9、 Struts2验证(声明式验证、自定义验证器)

    1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...

随机推荐

  1. linux卸载openjdk

    本来不想写的网上的东西罗嗦死了 sudo apt-get purge openjdk*

  2. SQL SERVER启动步骤

    第一步 从注册表读取SQL SERVER启动信息 (1)Audit  Level:设置SQL SERVER是否记录用户登陆信息 Login Mode:设置SQL SERVER登陆类型是只接受windo ...

  3. Android 5.0 版本 USB 调试模式打开方法

    Android 4.2 版本 USB 调试模式打开方法 1. 进入“设置”页面,点击“关于平板电脑”.见下图红色方框.   2. 疯狂点击“版本号”,见下图红色方框,直到出现“您现在处于开发者模式!” ...

  4. mcelog用法详解

    手动启动mcelog方法: # mcelog --daemon Run mcelog in daemon mode, waiting for errors from the kernel. 后台服务启 ...

  5. JavaScript -- 时光流逝(八):js中的事件Event的使用

    JavaScript -- 知识点回顾篇(八):js中的事件Event的使用 事件通常与函数配合使用,这样就可以通过发生的事件来驱动函数执行. (1) onabort : onabort 事件会在图像 ...

  6. Kali 2.0 下 Metasploit 初始化配置

    在kali 2.0中,命令行中直接输入msfconsole 提示不能连接到数据库 ,是由于postgresql 未启动.因此,需要开启postgresql,并且进行postgresql 的初始化配置. ...

  7. 《Java大学教程》—第21章 高级案例研究

    21.3    需求:P510用例模型(use case model):用例图(use case diagram).用例(use case).行为说明(behaviour specification) ...

  8. 2292: Quality of Check Digits 中南多校 暴力枚举

    #include <cstdio> #include <algorithm> #include <cstring> #include <iostream> ...

  9. BZOJ 4820 [SDOI2017] 硬币游戏

    Description 周末同学们非常无聊,有人提议,咱们扔硬币玩吧,谁扔的硬币正面次数多谁胜利.大家纷纷觉得这个游戏非常符合同学们的特色,但只是扔硬币实在是太单调了.同学们觉得要加强趣味性,所以要找 ...

  10. 设计模式のFilterPattern(过滤器模式)----结构模式

    一.产生背景 我们有一堆“人”的对象,我们应该怎么选择出其中的男性.女性或者其他类型的呢?这时候我们可以用过滤器模式 二.通常做法 我们将创建一个 Person 对象.Criteria 接口和实现了该 ...