2.Struts2

一.Struts2标签库

  1. 引用标签库:
<%@ taglib uri="/struts-tags"  prefix="s"%>
  1. 控制流程标签
<%
    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>
  1. 迭代标签
    循环迭代时,把每一个迭代的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>
  1. 属性标签
<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();

  1. 获取请求参数.
原始:Map<String,String[]> params = request.getParameterMap();
     现在:Map<String,String[]> params = ctx.getParameters();
  1. 操作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);
  1. 操作session作用域:
原始:HttpSession  session =request.getSession();
     现在:Map<String,Object> session = ctx.getSession(); 接下来就是操作Map对象
  1. 操作servletContext(application)作用域:
原始:ServletContext  servletContext = request.getServletContext();
     现在:Map<String,Object> app = ctx.getApplication();

三.拦截器

image

  1. 客户端发送请求;
  2. 该请求经过一系列的过滤器(Filter):其中可选过滤器ActionContextCleanUp,帮助Struts2和其他框架集成。例如:SiteMesh Plugin。
  3. 接着FilterDispatcher被调用,FilterDispatcher询问ActionMapper,来决定该请求是否需要调用某个Action。拦截器只对Action作拦截
  4. 若ActionMapper决定需要调用某个Action,FilterDispatcher把请求的处理交给ActionProxy。
  5. ActionProxy通过Configuration Manager询问框架的配置文件,找到需要调用的Action类。
  6. ActionProxy创建一个ActionInvocation的实例。
  7. ActionInvocation实例调用Action的前后,涉及到相关拦截器(Intercepter)的调用。
  8. 一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果result。

Struts2中内置的拦截器:
在struts-core-2.3.x.jar—>struts-default.xml中

常见的拦截器:

  1. params拦截器
    这个拦截器偷偷的把请求参数设置到相应的Action的属性去的,并自动进行类型转换。
  2. modelDriven拦截器
    如果Action实现ModelDriven接口,它将getModel()取得的模型对象存入OgnlValueStack中。
  3. execption拦截器
    顾名思义,在抛出异常的时候,这个拦截器起作用。最好把它放在第一位,让它能捕获所有的异常。
  4. validation拦截器
    调用验证框架读取 *-validation.xml文件,并且应用在这些文件中声明的校验。
  5. token拦截器
    核对当前Action请求(request)的有效标识,防止重复提交Action请求。
  6. fileUpload拦截器
    用来处理文件上传
  7. workflow拦截器
    调用Action的validate方法,一旦有错误返回,重新定位到INPUT结果视图
    在校验的时候,如果有错误,将错误信息放到一个List 集合中
    此时workflow拦截器来判断List集合中是否有数据,如果有就返回一个逻辑视图名称为input
  8. servletConfig
    通过感知接口,获取感应对象

四.自定义拦截器

  1. 自定义拦截器:CheckLoginInterceptor:
    1. 步骤1.定义拦截器类

      1. 方式1:实现com.opensymphony.xwork2.interceptor.Interceptor接口.
      2. 方式2(推荐):继承com.opensymphony.xwork2.interceptor.AbstractInterceptor类.
    2. 步骤2.在struts.xml中注册拦截器,告诉Struts2框架来帮我管理CheckLoginInterceptor.

      1. 第一步:先在中声明拦截器CheckLoginInterceptor.
      2. 第二步:在中来引用CheckLoginInterceptor拦截器.

image
定义一个拦截器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>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值