一.Struts2标签库
- 引用标签库:
<%@ taglib uri="/struts-tags" prefix="s"%>
- 控制流程标签
<%
request.setAttribute("num",5);
%>
<s:if test="#request.num > 10">大于10</s:if>
<s:elseif test="#request.num < 10">小于10</s:elseif>
<s:else>等于10</s:else>
- 迭代标签
循环迭代时,把每一个迭代的Goods对象存储在栈顶,所以可以从root的栈顶取出数据
<%
requst.setAttribute("list",java.util.Arrays.asList("A","B","C","D"));
%>
<s:iterator value="#result.data" var="l">
<tr>
<td><s:property value="id" /></td>
<td><s:property value="name" /></td>
<td><s:property value="brand" /></td>
<td><s:property value="sal" /></td>
<td><s:a action="goods_delete">删除
<s:param name='goods.id' value="id" />
</s:a>| <s:a action="goods_input">编辑
<s:param name='goods.id' value="id" />
</s:a></td>
</tr>
</s:iterator>
- 属性标签
<s:property value="brand"/>
<s:radio list="#{'boy':'男','girl':'女'}" name="gender" value="%{boy}"/>
<s:select list="#{'g':'广州','c':'成都','n':'南充'}" name="city"
headerKey="-1" headerValue="--请选择--"/>
二.访问Servlet的API
通过ActionContext类
理解ActionContext:从字面上分析,表示Action的上下文对象.
ActionContext封装每一次请求的相关信息.
获取ActionContext对象:
ActionContext ctx = ActionContext.getContext();
- 获取请求参数.
原始:Map<String,String[]> params = request.getParameterMap();
现在:Map<String,String[]> params = ctx.getParameters();
- 操作request作用域:
原始:request.setAttribute(String name, Object value); Object val = request.getAttribtue(String name);
现在:ctx.put(String key,Object value); Object val = ctx.get(String name);
- 操作session作用域:
原始:HttpSession session =request.getSession();
现在:Map<String,Object> session = ctx.getSession(); 接下来就是操作Map对象
- 操作servletContext(application)作用域:
原始:ServletContext servletContext = request.getServletContext();
现在:Map<String,Object> app = ctx.getApplication();
三.拦截器
- 客户端发送请求;
- 该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin。
- 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action。拦截器只对Action作拦截
- 若ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
- ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
- ActionProxy创建一个ActionInvocation的实例。
- ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。
- 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。
Struts2中内置的拦截器:
在struts-core-2.3.x.jar—>struts-default.xml中
常见的拦截器:
- params拦截器
这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。 - modelDriven拦截器
如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。 - execption拦截器
顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。 - validation拦截器
调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。 - token拦截器
核对当前Action请求(request)的有效标识,防止重复提交Action请求。 - fileUpload拦截器
用来处理文件上传 - workflow拦截器
调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图
在校验的时候,如果有错误,将错误信息放到一个List 集合中
此时workflow拦截器来判断List集合中是否有数据,如果有就返回一个逻辑视图名称为input - servletConfig
通过感知接口,获取感应对象
四.自定义拦截器
- 自定义拦截器:CheckLoginInterceptor:
-
步骤1.定义拦截器类
- 方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.
- 方式2(推荐):继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类.
-
步骤2.在struts.xml中注册拦截器,告诉Struts2框架来帮我管理CheckLoginInterceptor.
- 第一步:先在中声明拦截器CheckLoginInterceptor.
- 第二步:在中来引用CheckLoginInterceptor拦截器.
-
定义一个拦截器CheckLoginInterceptor
//登录拦截器
public class CheckLoginInterceptor extends AbstractInterceptor {
@Setter
private String sessionKey;
@Setter
private String viewName;
private static final long serialVersionUID = 1L;
//拦截方法
public String intercept(ActionInvocation invocation) throws Exception {
System.out.println("登录检查拦截...");
//判断session中是否有USER_IN_SESSION
Object user = invocation.getInvocationContext().getSession().get(sessionKey);
if (user == null) {
//么有登录
return viewName;//逻辑视图名称
}
//返回放行的逻辑视图
return invocation.invoke();
}
登录Action,LoginAction
public class LoginAction extends ActionSupport{
@Getter@Setter
private String name;
//校验方法
public void validate() {
int length = name.trim().length();
if (length < 4 || length > 9) {
System.out.println("用户名位数4-9");
super.addActionError("用户名位数必须为:4-9");
}
}
private static final long serialVersionUID = 1L;
public String execute() {
System.out.println("数据库查询--->" + name);
ActionContext.getContext().getSession().put("USER_IN_SESSION", name);
return SUCCESS;
}
}
struts-login.xml
<?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>
<package name="interceptorPkg" extends="struts-default">
<!-- 注册拦截器 -->
<interceptors>
<interceptor name="checkLogin" class="com.dusk._01_login.CheckLoginInterceptor">
<!-- 配置当前拦截器的参数:使用的是内省Setter -->
<!-- 相当于调用setSessionKey方法 -->
<param name="sessionKey">USER_IN_SESSION</param>
<!-- 相当于调用setViewName方法 -->
<param name="viewName">login</param>
</interceptor>
<!-- 注册一个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="checkLogin"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<!-- 配置该包中的默认拦截器 -->
<default-interceptor-ref name="myStack"/>
<!-- 全局结果视图 -->
<global-results>
<result name='login' type='redirect'>/login.jsp</result>
<result name='input' type='redirect'>/login.jsp</result>
</global-results>
<action name="login" class="com.dusk._01_login.LoginAction">
<!-- 配置当前Action专门执行的拦截器 -->
<interceptor-ref name="defaultStack"/>
<result type="redirectAction">main</result>
</action>
<!-- 使用默认的Action来完成中间转账 -->
<action name="main">
<!-- 引用拦截器 -->
<result>/WEB-INF/views/welcom.jsp</result>
</action>
</package>
</struts>
struts.xml
<?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>
<constant name="struts.devMode" value="true" />
<!-- 设置简单主题 -->
<constant name="struts.ui.theme" value="simple" />
<include file="com/dusk/_01_login/struts-login.xml"></include>
</struts>
welcom.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>欢迎</title>
</head>
<body>
<h3>欢迎${sessionScope.USER_IN_SESSION}进来</h3>
</body>
</html>
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0" metadata-complete="false">
<!-- 配置struts2框架的前端控制器,是框架的入口 -->
<filter>
<filter-name>struts</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>登录界面</title>
</head>
<body>
<s:debug />
<span style="color: red;"> <s:property value="actionErrors" /></span>
<s:form action="login">
姓名:
<s:textfield name="name" />
<input type="submit" value="登录">
</s:form>
</body>
</html>