Struts2------拦截器和标签库和注解开发
一、解析Struts2源码中拦截器的执行
客户端请求Action,执行前端控制器,在前端控制器内部创建了Action的代理类,调用代理类的execute方法,在execute方法内部执行ActionInvocation的invoke方法。
在invoke方法内部递归调用拦截器的拦截的方法。如果没有下一个拦截器执行目标Action,Action执行结束后根据Result进行页面跳转,最后由response对象生成响应。
- 流程图
二、自定义拦截器
方式一:实现Interceptor接口
方式二:继承AbstractInterceptor
方式三:继承MethodFilterInterceptor
步骤(方式三:)
1)创建一个类,继承MethodFilterInterceptor,复写doInterceptor方法
public class Interceptor03 extends MethodFilterInterceptor { @Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("Interceptor03 执行了...");
//放行
invocation.invoke();
return null;
} }
2) 在struts.xml配置拦截器(声明和使用)
<package name="test" extends="struts-default" namespace="/">
<!-- 声明拦截器 -->
<interceptors>
<interceptor name="interceptor03" class="com.itheima.web.interceptor.Interceptor03"> </interceptor>
</interceptors>
</package> <action name="demo_*" class="com.itheima.web.action.ActionDemo" method="{1}">
<interceptor-ref name="interceptor03">
<!--不拦截fun02()方法 -->
<param name="excludeMethods">fun02</param>
</interceptor-ref>
</action>
备注:MethodFilterInterceptor是AbstractInterceptor的一个子类,可以精确控制拦截或者不拦截哪一个方法
三、关于自定义拦截器的一些操作
- 拦截器处理结果
1)放行:这里放行的意思是是否放行通道给下一个拦截器,语句:xx.invoke()。这时候,CPU执行完这个拦截器后,将会执行下一个拦截器
2)拦截:这里拦截的意思是,是说不执行下一个拦截器。这时候会执行return 的内容,也需要返回到一个具体的页面。因此需要在struts.xml配置result标签。例如该拦截器return "success",则在struts.xml中配置<result name="success">/success.jsp</result>,这时候会跳转到success.jsp页面
- 自定义拦截器的问题
一旦定义了自己的拦截器,struts2默认的那一套拦截器就不会执行,可以参考有参构造和无参构造方法来理解。
因此defaultStack的这个拦截器包的功能会失效,但在action里重新引用即可启动这些功能
<action name="actionDemo_*" class="com.itheima.action.ActionDemo" method="{1}">
<!-- 执行这个action,就必然要走名字叫做myInterceptor02的拦截器 -->
<!-- 使用默认的拦截器 -->
<interceptor-ref name="defaultStack"></interceptor-ref> <!-- 使用自定义的拦截器 -->
<interceptor-ref name="myInterceptor"></interceptor-ref>
<result name="login">/index.jsp</result>
</action>
四、标签库
- 介绍
Struts2的标签库一个字概括,多。它功能比较完善,另外还提供了主题和模板的支持。这些标签都在 docs/docs/tag-reference.html
里面可以找到
以下为标签库分类图:
- 使用步骤
先导库<%@taglib uri="/struts-tags" prefix="s" %>,然后根据语法书写
- 例子
取值:
if else标签
<s:property value="#request.a"/><br/> <s:if test="#request.a > 10">
a 大于10
</s:if>
<s:else>
a 小于或者等于10
</s:else>
<s:iterator value="list" var="u">
<s:property value="username"/>
<s:property value="password"/>
</s:iterator>
和HTML标签对比例子
<h1>一,HTML的表单标签</h1>
<form action="${pageContext.request.contextPath }/demo03_fun03" method="post">
用户名:<input type="text" name="username"/><br/>
密码: <input type="password" name="password"/><br/>
性别:<input type="radio" name="sex" value="1"/>男<input type="radio" name="sex" value="0"/>女<br/>
爱好:
<input type="checkbox" name="hobby" value="lq"/>篮球
<input type="checkbox" name="hobby" value="zq"/>足球
<input type="checkbox" name="hobby" value="ppq"/>乒乓球
<input type="checkbox" name="hobby" value="qdm"/>敲代码<br/>
籍贯:<select name="address">
<option value="-1">-请选择-</option>
<option value="0">北京</option>
<option value="1">上海</option>
<option value="2">深圳</option>
</select><br/>
自我介绍:<textarea rows="2" cols="8" name="introduce">哈哈哈</textarea><br/>
<input type="submit" />
</form> <h1>二,Struts2的表单标签</h1>
<!--默认请求方式就是post,action不用写项目路径 -->
<s:form action="/demo03_fun03">
<s:textfield name="username" label="用户名" />
<s:password name="password" label="密码"/>
<%-- <s:radio list="{'男','女'}" name="sex" label="性别"/> --%>
<s:radio list="#{'1':'男','0':'女' }" name="sex" label="性别" value="1"></s:radio>
<s:checkboxlist list="{'篮球','足球','乒乓球','敲代码'}" label="爱好" name="hobby"/>
<s:select list="#{'0':'北京','1':'上海','2':'深圳' }" label="籍贯" name="address" headerKey="-1" headerValue="请选择" value="1"></s:select>
<s:textarea cols="8" rows="2" name="introduce" label="籍贯" value="哈哈"></s:textarea>
<s:submit value="注册" align="left"/>
</s:form>
- Struts2的模板和主题
主题就是一种风格化标签,能够让所有UI标签能够产生同样的视觉效果而归集到一起的一组模板,即风格相近的模板被打包为一个主题. struts2提供了四种主题simple、xhtml、css_xhtml、ajax。
simple:把UI标签翻译成最简单的HTML对应元素,而且会忽视行标属性
xhtml:默认的主题。这个主题的模板通过使用一个布局表格提供了一种自动化的排版机制(默认)
css_xhtml:这个主题里的模板与xhtml主题里的模板很相似,但他们将使用css来进行布局和排版
ajax:这个主题里的模板以xhtml主题里的模板为基础,但增加了一些ajax功能。
做法:通过配置struts.xml的constant属性:struts.ui.theme
<constant name="struts.ui.theme" value="simple"></constant>
或者通过UI标签的theme属性修改
<s:form action="..." theme="simple">
五、Struts2里的注解开发
- 步骤; 1)先导入Jar包:struts2-convention-plugin-x.x.x.jar 2)在action类中配置注解标签
struts.xml
<package name="test" extends="struts-default" namespace="/">
<action name="demo_fun01" class="com.itheima.web.action.ActionDemo01"
method="fun01">
<result name="success">/demo01.jsp</result>
</action>
</package>
对应的注解
Namespace 注解
用来模拟package标签的
namespace属性
的。 需要在Action的类上配置。
ParentPackage 注解
用来模拟package标签的
extends属性
的。 需要在Action的类上配置。
Action注解
用来模拟
action标签
的。需要在action类中的action方法上配置。 value属性用来模拟
action标签
中的name属性
results属性用来模拟
action标签
内的result标签
Result注解
用来模拟result标签的。可以在action类上配置或者在action方法上配置。 action类上配置就是全局的。action方法上的配置是局部的。
name属性用来模拟
result标签
的name属性
type属性用来模拟
result标签
的type属性
locaction属性用来模拟
result标签
的标签内容 params属性用来模拟
result标签
的内部param标签
最新文章
- 使用beautifulsoup与requests爬取数据
- Python 判断变量的类型
- springMVC文件上传
- Redis监控技巧(转)
- Java遍历Map的3种方式
- 从客户端中检测到有潜在危险的Request.Form值 的解决方法
- 如何利用jq来实现复选框的全选,反选!
- Sde表结构分析
- Winform 窗体的操作
- maya和Unity中的坐标系旋转
- 通过cl_dd_document来实现在ALV中输出标题头
- C++ 多源码文件简单组织
- ios学习笔记(一)Windows7上使用VMWare搭建iPhone开发环境
- SQL逻辑查询语句执行顺序
- why big data
- 关于Asp.Net中的编程实现下载
- CentOS6下源码安装mysql-5.6.25
- 设计模式--策略模式C++实现
- 数据结构&;字符串:01字典树
- 20145109 《Java程序设计》第七周学习总结
热门文章
- JS日历控件 灵活设置: 精确的时分秒.
- web 开发之js---ajax 中的两种提交方式ajax post 和 ajax get 实例
- npm, webpack, vue-cli, vue-x, axios
- linux losetup
- 显示 目录 大小 du
- Spring创建JobDetail的两种方式
- 网络编程-获取ip-解析ip
- ubuntu12.04安装tftp,配置,修改目录,错误类型
- YTU 2920: Shape系列-7
- android编译打包(用ant脚本打包)