struts2的基本使用
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的基本使用的更多相关文章
- 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?
今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- 菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习.主要对Struts2文档Guides中的Action分支进行学习,如下图: 1.Model Driven(模型驱动) St ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 13、零配置Struts2开发
Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...
- 12、Struts2表单重复提交
什么是表单重复提交 表单的重复提交: 若刷新表单页面, 再提交表单不算重复提交. 在不刷新表单页面的前提下: 多次点击提交按钮 已经提交成功, 按 "回退" 之后, 再点击 &qu ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- 9、 Struts2验证(声明式验证、自定义验证器)
1. 什么是Struts2 验证器 一个健壮的 web 应用程序必须确保用户输入是合法.有效的. Struts2 的输入验证 基于 XWork Validation Framework 的声明式验证: ...
随机推荐
- web前端(5)—— 常用标签2
以下三个不仅是常用标签了,还非常重要,所以请务必好好看,重要性从高到低: 盒模型div div标签是最常用最重要的,它可以把web页面分割成很多的小块分别管理 测试代码: <!DOCTYPE h ...
- 后台登录(包含验证码)的php代码实现
login.html文件 <html> <title>login in</title> <body> <form action="han ...
- 内网ip/公网ip
ip地址初识: 现在的IP网络使用32位地址,以点分十进制表示,如172.16.0.0.地址格式为:IP地址=网络地址+主机地址 或 IP地址=网络地址+子网地址+主机地址. IP地址类型 最初设计互 ...
- 如何用Jupyter notebook打开本地数据集
首先打开本地Jupyter notebook,出现类似页面并进入网页端Home. 网页端界面类似如下: 需要注意的是,Jupyter notebook只能打开当前目录下的数据集,如csv,所以需要使用 ...
- Java多线程(一) 什么是线程
声明:本系列大多是翻译自https://www.javatpoint.com,加上自己的增删改,尽力写的系统而通俗易懂,后文不再重复声明. 点我跳过黑哥的卑鄙广告行为,进入正文. Java多线程系列更 ...
- Pandas 拼接操作 数据处理
数据分析 生成器 迭代器 装饰器 (两层传参) 单例模式() ios七层 io多路 数据分析:是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律 pandas的拼接操作 p ...
- Scrapy 框架 使用 selenium 爬取动态加载内容
使用 selenium 爬取动态加载内容 开启中间件 DOWNLOADER_MIDDLEWARES = { 'wangyiPro.middlewares.WangyiproDownloaderMidd ...
- [CQOI2014]和谐矩阵
嘟嘟嘟 遇到这种(看似)构造的题,我好像一般都做不出来-- 然而这题正解是高斯消元解异或方程组-- 首先我们容易列出式子a[i][j] ^ a[i - 1][j] ^ a[i + 1][j] ^ a[ ...
- Flask-SQLAlchemy常用操作
一.SQLAlchemy介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用数 ...
- ActiveMQ 控制台使用方法
一.为什么使用ActiveMQ 在总线的设计中可能会使用到JMS(Java Message Service)通道, Java消息服务(JMS)超越了生产商专有的MOM(Message-Oriented ...