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. web前端(5)—— 常用标签2

    以下三个不仅是常用标签了,还非常重要,所以请务必好好看,重要性从高到低: 盒模型div div标签是最常用最重要的,它可以把web页面分割成很多的小块分别管理 测试代码: <!DOCTYPE h ...

  2. 后台登录(包含验证码)的php代码实现

    login.html文件 <html> <title>login in</title> <body> <form action="han ...

  3. 内网ip/公网ip

    ip地址初识: 现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0.地址格式为:IP地址=网络地址+主机地址 或 IP地址=网络地址+子网地址+主机地址. IP地址类型 最初设计互 ...

  4. 如何用Jupyter notebook打开本地数据集

    首先打开本地Jupyter notebook,出现类似页面并进入网页端Home. 网页端界面类似如下: 需要注意的是,Jupyter notebook只能打开当前目录下的数据集,如csv,所以需要使用 ...

  5. Java多线程(一) 什么是线程

    声明:本系列大多是翻译自https://www.javatpoint.com,加上自己的增删改,尽力写的系统而通俗易懂,后文不再重复声明. 点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更 ...

  6. Pandas 拼接操作 数据处理

    数据分析 生成器 迭代器 装饰器 (两层传参) 单例模式() ios七层 io多路 数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律 pandas的拼接操作 p ...

  7. Scrapy 框架 使用 selenium 爬取动态加载内容

    使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...

  8. [CQOI2014]和谐矩阵

    嘟嘟嘟 遇到这种(看似)构造的题,我好像一般都做不出来-- 然而这题正解是高斯消元解异或方程组-- 首先我们容易列出式子a[i][j] ^ a[i - 1][j] ^ a[i + 1][j] ^ a[ ...

  9. Flask-SQLAlchemy常用操作

    一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...

  10. ActiveMQ 控制台使用方法

    一.为什么使用ActiveMQ 在总线的设计中可能会使用到JMS(Java Message Service)通道, Java消息服务(JMS)超越了生产商专有的MOM(Message-Oriented ...