struts2《轻量级框架应用与开发--S2SH》笔记

本文详细介绍了Struts2框架的基本概念、处理流程及项目搭建步骤。涵盖了常量配置、Action实现方式等内容,深入探讨了ActionContext访问servletAPI的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struts2基础

struts2处理步骤

struts2处理步骤
1、客户端浏览器发送一个HTTP请求,例如,请求/somepage .action、/video/somevideo.mp4等;
2、web容器收到请求后,将请求传递给一个标准的ActionContextCleanUp过滤器来清除属性,不让后续的过滤器清除,从而延长Action中属性的生命周期,以便页面进行访问;
3、ActionContextCleanU批处理过后再经过其他过滤器,如SitMesh等,传递给核心控制器StrutsPrePareAndExecuteFilter;
4、StrutsPrePareAndExecuteFilter調用AcionMapper確定請求那個Action將控制器委派給ActionProxy代理
5、ActionProxy代理調用配置管理器ConfigurationManager从配置管理器ConfigurationManager从配置文件struts.xml中读取信息,创建ActionInvocation对象;
6、ActionInvocation在调用Action之前会一次调用所有配置拦截器脸,一旦Action执行结果返回字符串,ActionInvocation会根据该结果字符串查找对应的Result;
7、Result会调用视图模板如JSP、FreeMarker来显示,并在客户端HTTP相应之前,以相反的顺序执行拦截器链。
8、最后HTTP相应被返回给核心控制器StrutsPrepareAndExecuteFilter,一次经过web.xml中配置过滤器,发送给客户端。

创建一个struts2项目

1、配置StrutsPrepareAndExecuteFilter,就是web.xml配置过滤器
2、创建输入视图,index.jsp页面
3、创建业务与控制器,就是action连接
4、配置业务控制器struts.xml文件
5、创建结果视图,就是执行后返回的视图result.jsp或error.jsp

1、配置web.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>chapter02</display-name>
  <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>
  <welcome-file-list>
  	<welcome-file>index.html</welcome-file>
  	<welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

2、创建输入视图

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
	<form action="user.action" method="post">
		用户名:<input type="text" name="userName"><br/>
		地址:<input type="text" name="address"><br/>
		电话:<input type="text" name="telephone"><br/>
		邮箱:<input type="text" name="email"><br/>
		<input type="submit" name="" value="提交">
	</form>
</body>
</html>

3、创建业务控制器

package com.qst.chapter02.action;

public class UserAction {
	//用户名
	private String userName;
	//地址
	private String address;
	//电话
	private String telephone;
	//邮箱
	private String email;
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getTelephone() {
		return telephone;
	}
	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	public String execute() throws Exception{
		if(userName.length() > 0 & address.equals("青岛")){
			return "success";
		}else{
			return "error";
		}
	}
}

struts.xml文件没有配置,默认执行execute方法

4、配置业务控制器,struts.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">
    <struts>
    	<constant name="struts.devMode" value="true"/>
    	
    	<!-- struts2的action都必须配置在package力 -->
    	<package name="default" namespace="/" extends="struts-default">
    		<!-- 定义一个名为user的action,实现类 -->
    		<action name="user" class="com.qst.chapter02.action.UserAction">
    			<result name="success">/result.jsp</result>
    			<result name="error">/error.jsp</result>
    		</action>
    	</package>
    </struts>

5、创建结果视图
result.jsp和error.jsp
result.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
		用户名:${param.userName}<br/>
		地址:${param.address}<br/>
		电话:${param.telephone}<br/>
		邮箱:${param.email}<br/>
		
</body>
</html>

error.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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>
	您输入的信息不符合要求,重新输入。
</body>
</html>

struts2进阶

struts2常量配置(struts.xml)

建议在struts.xml文件中配置相应属性

<struts>
    	<!-- 指定struts2是否使用开发模式,默认为false,开发阶段设置为true -->
    	<constant name="struts.devMode" value="true"/>
    	<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    	
    	<!-- 指定web应用默认,Locale,默认en_US -->
    	<constant name="struts.locale" value="en_US"></constant>
    	<!-- 指定默认的web应用默认编码集,默认UTF-8 -->
    	<constant name="struts.il8n.encoding" value="UTF-8"></constant>
    	<!-- 处理multipart/form-data的MIME类型(文件上传)请求,默认jakarta,可以支持cos、pell和common-
    	fileupload文件上传 -->
    	<constant name="struts.multipart.parser" value="jakarta"></constant>
    	<!-- 指定上传文件的临时保存了路径 -->
    	<constant name="struts.multipart.saveDir" value="javax.servlet.context.tempdir"></constant>
    	<!-- 指定上传文件的最大字节数 -->
    	<constant name="struts.multipart.maxSize" value="1024"></constant>
    	<!-- 指定将http请求映射指定的action映射器中,默认是org.apache.struts2.dispatcher.mapper.DefaultActionMapper -->
    	<constant name="struts.mapper.class" value="org.apache.struts2.dispatcher.mapper.DefaultActionMapper"></constant>
    	<!-- 指定需要struts2处理的请求后缀,默认值是action,即所有与*.action匹配的请求都有struts2处理 -->
    	<constant name="struts.action.extension" value="action"></constant>
    	
    	<!-- 默认ObjectFacotry Bean -->
    	<constant name="struts.objectFactory" value=""></constant>
    	
    	
    	
    	<!-- 设置浏览器是否缓存静态内容,开发阶段通常设置为false -->
    	<constant name="struts.serve.static.browserCache" value="false"></constant>
    	<!-- 当struts.xml改变后,系统是否指定重新加载文件,默认为false,开发阶段为true -->
    	<constant name="struts.configuration.xml.reload" value="false"></constant>
    	<!-- 自定XSLT Result是否使用样式表缓存,开发阶段通常设置为true -->
    	<constant name="struts.xslt.nocache" value="true"></constant>
    	<!-- 指定struts2所需要的的国际化资源文件多个文件之间使用英文,隔开 -->
    	<constant name="struts.customer.il8n.resources" value=","></constant>
    	<!-- 指定struts2框架加载用户自定义敞亮文件,多个文件用英文","隔开 -->
    	<constant name="struts.customer.properties" value=","></constant>
</struts>

struts2包配置
1、修改namespace命名空间(/表示:应用路径/user.action-- 如果是/admin表示:应用路径/admin/user.action)
2、修改action name属性,相应的拦截的action
3、修改映射页面result中的相应页面

 <struts>
    	<constant name="struts.devMode" value="true"/>
    	
    	<!-- struts2的action都必须配置在package力 -->
    	<package name="default" namespace="/" extends="struts-default">
    		<!-- 定义一个名为user的action,实现类 -->
    		<action name="user" class="com.qst.chapter02.action.UserAction">
    			<result name="success">/result.jsp</result>
    			<result name="error">/error.jsp</result>
    		</action>
    	</package>
    	
    </struts>

包含其他配置文件

<struts>
<include file="struts-part1.xml">
</struts>

实现action

pojo实现方式

普通的pojo类,通常还包含一个五参数的execute方法返回值为字符串

package com.qst.chapter03.action;

public class LoginAction {

	private String userName;
	
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute(){
		System.out.println("用户名:"+userName);
		System.out.println("密码名"+password);
		if(userName.startsWith("qst")&&password.length()>=6){
			return "success";
		}else{
			return "error";
		}
	}
	
}

action接口实现方式

继承ActionSupport类

validate()验证方法struts2框架自动返回inupt输入视图。

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction3 extends ActionSupport{

private String userName;
	
	private String password;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}
	
	public String execute(){
		System.out.println("用户名:"+userName);
		System.out.println("密码名"+password);
		if(userName.startsWith("qst")&&password.length()>=6){
			return SUCCESS;
		}else{
			return ERROR;
		}
	}
	
	public void validate(){
		//简单验证用户输入
		//struts自动返回input接口
		if(this.userName == null || this.userName.equals("")){
			this.addFieldError("userName", "用户名不能为空!");
			System.out.println("用户名为空!");
		}
		if(this.password == null || this.password.length() < 6){
			this.addFieldError("password", "密码不能为空且长度不能小于6");
			System.out.println("密码不能为空且长度不能小于6");
		}
	}
	
}

ActionContext 访问servletAPI

常用方法

方法功能描述
Object get(Object key)获取属性值,与HttpServletRequest的getAttribute(String name)方法类似
Map getApplication()返回一个Map对象,该对象模拟web应用对应的ServletContext对象
static ActionContext getcONTEXT()静态方法,用于获取系统的ActionContext对象
Map getParameters()获取所有的请求参数,类似HttpServletRequest对象的getParameterMap()
Map GetSession返回一个Map对象,该对象模拟HttpSession实例
void setApplication(Map application)直接传入一个Map独享,该对象键值对转换成application的属性名和属性值
void setSession(Map session)直接传入一个Map对象,该对象的Map对象里的键值对转换成session的属性名和属性值

例如

package com.qst.chapter03.action;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class ClickNumAction extends ActionSupport{

	public String execute(){
		ActionContext ctx = ActionContext.getContext();
		
		Integer num = (Integer)ctx.getApplication().get("num");
		
		if(num==null){
			num=1;
		}else{
			num++;
		}
		ctx.getApplication().put("num", num);
		return SUCCESS;
	}
	
}

该实例先试用actioncontext.getContext()静态方法获取系统的ActionContext对象,再调用ActionContext对象的getApplication方法获取ServletCotnext对象的Map对象。进行get和put操作。

访问servletapi

注意有三种接口访问不同对象

接口名描述
ServletContextAware实现该接口action直接访问web应用的ServletContext
ServletRequestAware实现该接口的Action可以直接访问用户请求的HttpServletRequest实例
ServletResponseAware实现该接口的Action可以直接访问服务器响应的HttpServletRespone实例

继承接口之后,要定义响应的属性
比如
private HttpServletRequest request;

继承servletRequestAware方法

package com.qst.chapter03.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction4 extends ActionSupport implements ServletRequestAware{


	private String userName;
	
	private String password;
	
	private HttpServletRequest request;

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		this.request = request;
	}
	
	public String execute(){
		System.out.println("用户名:"+userName);
		System.out.println("密码名"+password);
		if(userName.startsWith("qst")&&password.length()>=6){
			HttpSession session = request.getSession();
			session.setAttribute("CurUser", userName);
			return SUCCESS;
		}else{
			return ERROR;
		}
	}
	
	public void validate(){
		if(this.userName == null || this.userName.equals("")){
			this.addFieldError("userName", "用户名不能为空");
			System.out.println("用户名为空!");
		}
		if(this.password == null || this.password.length() < 6){
			this.addFieldError("password", "密码不能为空且长度不能小于6");
			System.out.println("密码不能为空且长度不能小于6");
		}
	}
	
}

配置Action(包括动态方法调用)

在struts.xml中配置相应的Action
package包组织action,在struts.xml中通过使用package中action配置action,需要指定action元素的name和class属性
name:指定actino名字,该action中处理url,比如,login表示该action的url为login.action
class:值action实现类。

result元素表示返回映射,比如在java文件返回值是return “success”
表示返回success映射。

<package name="default" namespace="/" extends="struts-default">
	<action name="login" class-"com.qst.chapter03.action.LoginAction">
		<result name="success">ok.jsp</result>
	</action>
</package>

前面都是单个action对应一个类的方法execute,那么如何调用action里面不同方法?
动态方法调用
index.jsp

<a href="product!edit.action?productId=1000">编辑</a>
<a href="product!del.action?productId=1000">删除</a>

前提在productAction中有edit和del方法,struts.xml中配置了action name=“product”。

我们也可以使用通配符调用方法

<action name="*product" class="com.qst.chapter03.action.ProductAction" method="{1}">
    			<result name="edit" type="dispatcher">/edit.jsp</result>
    			<result name="del">/del.jsp</result>
    			<allowed-methods>del,edit</allowed-methods>
    		</action>

访问直接使用

<a href="editproduct.action?productId=1000">编辑</a>
<a href="delproduct.action?productId=1000">删除</a>

result

局部result

<package name="test" extends="struts-default">
	<action name="login" class="com.qst.chapter03.action.LoginAction">
		<result name="success" type="dispatcher">/ok.jsp</result>
	</action>
</package>

全局reuslt

<package name="test" extends="struts-default">
	<global-results>
		<result>/ok.jsp</result>
	</global-results
	<action name="login" class="com.qst.chapter03.action.LoginAction">
		
	</action>
</package>

result类型

结果类型描述
dispatcher应用于整合jsp技术
redirect重定向其他url
redirectAction重定向其他Action
chain用于进行action链式处理
chart用于整合JFreeChart技术
dispatcher应用于整合jsp技术
freemarker整合FreeMarker
httpheader控制特殊http
jasper整合jasperReport报表技术
jsf整合JSF技术
stream向浏览器返回inputStream,一般用于文件下载
tiles整合Tiles
velocity整合velocity
xslt整合xml/XSLT技术
plainText显示某个页面源代码

默认dispatcher技术。

异常(抛出异常的映射)

需要配置 两个属性exception和result属性
exception:用于指定action出现异常所映射的类型(java.lang.Exception)
result:指定转入action中的error或者中配置的元素

LoginAction5.java

package com.qst.chapter03.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.struts2.interceptor.ServletRequestAware;

import com.opensymphony.xwork2.ActionSupport;

public class LoginAction5{

	private String userName;
	
	private String password;
	

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String execute(){
		System.out.println("用户名:"+userName);
		System.out.println("密码名"+password);
		if(userName.startsWith("qst")&&password.length()>=6){
			return "success";
		}else{
			throw new RuntimeException("用户登录失败!");
		}
	}
	
}

struts.xml

<!-- 定义一个名为user的action,实现类 -->
    		<action name="login5" class="com.qst.chapter03.action.LoginAction5">
    			<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
    			<result name="success">/ok.jsp</result>
    			<result name="error">/error.jsp</result>
    		</action>

struts2标签库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值