Struts2——笔记04
Struts2拦截器概述
- Struts2封装的功能是靠拦截器实现的
- Struts2有很多的功能,也就是有很多的拦截器,每次加载时,只加载一些默认的拦截器
- Struts2中默认拦截器配置的位置(该jar包下的struts-default.xml文件)
- 默认加载的拦截器
<interceptor name="alias" class="com.opensymphony.xwork2.interceptor.AliasInterceptor"/>
<interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
<interceptor name="chain" class="com.opensymphony.xwork2.interceptor.ChainingInterceptor"/>
<interceptor name="conversionError" class="org.apache.struts2.interceptor.StrutsConversionErrorInterceptor"/>
<interceptor name="cookie" class="org.apache.struts2.interceptor.CookieInterceptor"/>
<interceptor name="cookieProvider" class="org.apache.struts2.interceptor.CookieProviderInterceptor"/>
<interceptor name="clearSession" class="org.apache.struts2.interceptor.ClearSessionInterceptor" />
<interceptor name="createSession" class="org.apache.struts2.interceptor.CreateSessionInterceptor" />
<interceptor name="debugging" class="org.apache.struts2.interceptor.debugging.DebuggingInterceptor" />
<interceptor name="execAndWait" class="org.apache.struts2.interceptor.ExecuteAndWaitInterceptor"/>
<interceptor name="exception" class="com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor"/>
<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<interceptor name="i18n" class="com.opensymphony.xwork2.interceptor.I18nInterceptor"/>
<interceptor name="logger" class="com.opensymphony.xwork2.interceptor.LoggingInterceptor"/>
<interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="scopedModelDriven" class="com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>
<interceptor name="actionMappingParams" class="org.apache.struts2.interceptor.ActionMappingParametersInteceptor"/>
<interceptor name="prepare" class="com.opensymphony.xwork2.interceptor.PrepareInterceptor"/>
<interceptor name="staticParams" class="com.opensymphony.xwork2.interceptor.StaticParametersInterceptor"/>
<interceptor name="scope" class="org.apache.struts2.interceptor.ScopeInterceptor"/>
<interceptor name="servletConfig" class="org.apache.struts2.interceptor.ServletConfigInterceptor"/>
<interceptor name="timer" class="com.opensymphony.xwork2.interceptor.TimerInterceptor"/>
<interceptor name="token" class="org.apache.struts2.interceptor.TokenInterceptor"/>
<interceptor name="tokenSession" class="org.apache.struts2.interceptor.TokenSessionStoreInterceptor"/>
<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>
<interceptor name="store" class="org.apache.struts2.interceptor.MessageStoreInterceptor" />
<interceptor name="checkbox" class="org.apache.struts2.interceptor.CheckboxInterceptor" />
<interceptor name="datetime" class="org.apache.struts2.interceptor.DateTextFieldInterceptor" />
<interceptor name="profiling" class="org.apache.struts2.interceptor.ProfilingActivationInterceptor" />
<interceptor name="roles" class="org.apache.struts2.interceptor.RolesInterceptor" />
<interceptor name="annotationWorkflow" class="com.opensymphony.xwork2.interceptor.annotations.AnnotationWorkflowInterceptor" />
<interceptor name="multiselect" class="org.apache.struts2.interceptor.MultiselectInterceptor" />
<interceptor name="deprecation" class="org.apache.struts2.interceptor.DeprecationInterceptor" />
- 拦截器的执行时间
1)Action对象创建之后,方法执行之前
拦截器的底层原理
- AOP(面向切片编程)思想
1)简单的理解就是在不修改源码的情况下进行功能的添加 - 责任链模式
1)和过滤链类似
2)一个请求有多个过滤器进行过滤
过滤器和拦截器的区别
- 过滤器可以拦截任意内容,如:jsp、html、servlet等
- 拦截器只可以拦截Action
Servlet和Action的区别
- Servlet对象在第一次访问时创建,只创建一次,为单实例对象
- Action对象每次访问都会进行创建,可创建多个Action对象,为多实例对象
自定义拦截器
虽然在Struts2中有很多的默认拦截器,但是实际开发中还需要我们自己定义的拦截器
- 拦截器的结构
1)方式一:继承AbstractInterceptor类
2)方式二:实现Interceptor接口,并实现init()、destroy()、intercept()方法 - 开发中如何实现
1)继承MethodFilterInterceptor类,并重写方法
2)注册拦截器 - 具体示例
1)自定义拦截器示例整体结构
2)Action类
package tqb.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import tqb.entity.User;
public class MyAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
public User getUser() {
return user;
}
public String login(){
if (user.getUsername().equals("admin") && user.getPassword().equals("admin")){
//获得Session
HttpServletRequest request = ServletActionContext.getRequest();
HttpSession session = request.getSession();
session.setAttribute("user", user);
return "loginSuccess";
}else{
return "login";
}
}
public String add(){
return "success";
}
@Override
public User getModel() {
return user;
}
}
3)拦截器
package tqb.interceptor;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import tqb.entity.User;
public class MyInterceptor extends MethodFilterInterceptor {
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
HttpSession session = ServletActionContext.getRequest().getSession();
User user = (User) session.getAttribute("user");
if (user != null){
// 若user存在,则执行具体操作
return invocation.invoke();
}else{
// 若user不存在,则返回至登录页面
return "login";
}
}
}
4)配置文件
<!--
自定义拦截器的使用
-->
<package name="interceptor" extends="struts-default" namespace="/">
<!--
声明拦截器
-->
<interceptors>
<interceptor name="myInterceptor" class="tqb.interceptor.MyInterceptor"></interceptor>
</interceptors>
<action name="MyAction" class="tqb.interceptor.MyAction" method="login">
<!--
name:拦截器name值
-->
<interceptor-ref name="myInterceptor">
<!--
对login方法不进行拦截
-->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!--
当使用了自定义的拦截器后,默认的拦截器不再默认,需要手动进行添加
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="login">/login.jsp</result>
<result name="loginSuccess">/welcome.jsp</result>
</action>
<action name="MyActionAdd" class="tqb.interceptor.MyAction" method="add">
<!--
name:拦截器name值
-->
<interceptor-ref name="myInterceptor">
<!--
对login方法不进行拦截
-->
<param name="excludeMethods">login</param>
</interceptor-ref>
<!--
当使用了自定义的拦截器后,默认的拦截器不再默认,需要手动进行添加
-->
<interceptor-ref name="defaultStack"></interceptor-ref>
<result name="success">/index.jsp</result>
<result name="login">/login.jsp</result>
</action>
</package>
5)welcome.jsp和login.jsp
<body>
<a href="<c:url value='/MyActionAdd'/>">点击进入首页</a>
</body>
<body>
<form action="<c:url value='/MyAction'/>" method="post">
username:<input type="text" name="username"/><br>
password:<input type="password" name="password"/><br>
<input type="submit" value="login"/>
</form>
</body>
Struts2表单标签
- html表单标签(大部分在input里面封装 type=”值”)
text:普通输入项
password:密码输入项
radio:单选输入项
checkbox:复选输入项
file:文件上传项
hidden:隐藏项
button:普通按钮
submit:提交按钮
image:图片提交
reset:重置
select:下拉输入项
textarea:文本域 - struts2表单标签