Struts学习笔记(二)元素解析

本文深入探讨Struts2框架的配置与使用,包括包管理、动作类创建、动态方法调用及结果视图配置等核心概念,同时介绍了自定义结果类型和在动作类中访问Servlet API的方法。

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

Struts元素解析

  1. package

    • 作用:在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。
    • 属性:
      • name:包的名称。注意:包的名称在配置文件中唯一
      • extends:指定当前包的父包,一般情况下需要继承struts-default包,但不是必须的。 不过如果不继承的话,将无法使用struts2提供的核心功能。struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。
      • abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有< action >元素的包,就可以声明为抽象包。
      • namespace:名称空间。
        • 当指定了名称空间之后,访问路径:名称空间 + 动作名称 = 访问路径
        • 当不指定名称空间之后,该属性有默认值,默认值为"",注意不是"/"在这里插入图片描述
        • package的名称空间的查找顺序
          在这里插入图片描述
  2. action元素

    • 作用:配置动作用的。
    • 属性:
      • name:动作名称
      • class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport
      • method:动作类中的方法名称。默认是public String execute(){}
        • 要求:
          • public的
          • 返回值必须是String
          • 没有参数
    • 动作类:
      • 创建方式一:就是原始的创建java类的方式
public class HelloAction {
	
	/**
	 * 在动作类中的指定的动作方法
	 * 书写要求:
	 * 		1. 都是public
	 * 		2. 返回值都String
	 *      3. 没有参数
	 * @return
	 */
	
	public String sayhello(){
		System.out.println("sayhello方法执行");
		return "success";//与配置文件中的result的name值相对应
	}

}

  • 创建方式二:动作类实现Action接口(com.opensymphony.xwork2.Action)
/**
 * 创建动作类的第二种方式:
 * 	创建一个普通的类,实现Action接口,实现接口中的方法
 * @author 52261
 *
 */
public class Action1 implements Action {
	
	/**
	 * Action接口中的常量
	 * SUCCESS  "success" 当执行成功时,前往指定位置
	 * NONE "none" 不返回任何结果视图
	 * ERROR "error" 当执行方法出现异常,前往指定的位置
	 * INPUT "input" 数据回显
	 * LOGIN "login" 一般用于登录页面
	 */

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return SUCCESS;
	}

}
  • 创建方式三:动作类继承com.opensymphony.xwork2.ActionSupport(推荐使用)
/**
 * 第三种方式:
 * 		创建一个类,继承ActionSupport
 * 
 * 我们在开发中采取这种方式,来创建我们的动作类
 * @author zhy
 *
 */
public class Demo3Action extends ActionSupport{
	
	//当我们在类中什么都不写,一个动作方法都不提供时,有一个默认的动作方法:execute()
}

Struts.xml

<!-- 第三种创建动作类方式的配置 -->
		<action name="action3" class="com.itheima.web.action.Demo3Action">
			<result name="success">/success.jsp</result>
		</action>
		
		<!-- 访问默认的动作类和动作方法的配置 
			默认的动作类是:ActionSupport的类。它是在struts-default.xml的配置文件中定义着。
		-->
		<action name="defaultAction">
			<result name="success">/success.jsp</result>
		</action>
  • 动作的访问:
    * 使用通配符
    * 动态方法调用(注意:要将struts.enable.DynamicMethodInvocation配置上,配置为true)<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
    * 代码演示:
/**
 * 用户相关的动作类
 * @author zhy
 *
 */
public class UserAction extends ActionSupport {
	
	public String addUser(){
		System.out.println("添加用户");
		return SUCCESS;
	}
	
	public String updateUser(){
		System.out.println("更新用户");
		return SUCCESS;
	}
	
	public String deleteUser(){
		System.out.println("删除用户");
		return SUCCESS;
	}
	
	public String findUser(){
		System.out.println("查询用户");
		return SUCCESS;
	}
}

index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>title</title>
  </head>
  <body>
  		<%-- 使用通配符,访问动作类和动作方法
    	<a href="${pageContext.request.contextPath}/add_User.action" >添加用户</a>
    	<a href="${pageContext.request.contextPath}/update_User.action" >更新用户</a>
    	<a href="${pageContext.request.contextPath}/delete_User.action" >删除用户</a>
    	<a href="${pageContext.request.contextPath}/find_User.action" >查询用户</a>
    	--%>
    	
    	<%--动态方法调用 
    			动作名称!动作方法名称.action
    			动作名称!动作方法名称
    	--%>
    	<a href="${pageContext.request.contextPath}/user!addUser.action" >添加用户</a>
    	<a href="${pageContext.request.contextPath}/user!updateUser.action" >更新用户</a>
    	<a href="${pageContext.request.contextPath}/user!deleteUser.action" >删除用户</a>
    	<a href="${pageContext.request.contextPath}/user!findUser.action" >查询用户</a>
   </body>
</html>

Struts.xml

<!-- 动作方法调用的配置 
		<action name="addUser" class="com.lwb.web.action.Action3" method="addUser">
			<result name="success">/addUser.jsp</result>
		</action>
		
		<action name="updateUser" class="com.lwb.web.action.Action3" method="updateUser">
			<result name="success">/updateUser.jsp</result>
		</action>
		
		<action name="deleteUser" class="com.lwb.web.action.Action3" method="deleteUser">
			<result name="success">/deleteUser.jsp</result>
		</action>
		
		<action name="findUser" class="com.lwb.web.action.Action3" method="findUser">
			<result name="success">/findUser.jsp</result>
		</action>-->
		
		<!-- 使用通配符,配置动作方法 
			 *表示的是动作的名称,当有和动作名称相匹配的时候可以用{出现的位置}来代替
		<action name="*_*" class="com.lwb.web.action.Action3" method="{1}{2}">
			<result name="success">/{1}{2}.jsp</result>
		</action>
		-->
		
		<!-- 动态方法调用的配置 -->
		<action name="user" class="com.lwb.web.action.Action3">
			<result name="success">/success.jsp</result>
		</action>
		
  1. result元素
    • 作用:配置逻辑视图
    • 属性:
      • name:与动作方法的返回值对应,一致前往指定的jsp
      • type:结果试图类型,就是用什么方式转到定义的页面。不写时,有默认值dispatcher。
        • dispatcher:请求转发 默认值
        • redirect:重定向
        • chain:转发到另一个动作
          • 转发到同一名称空间下的另一个动作<result name="success" type="chain">action2</result>
          • 转发到不同名称空间下的另一个动作 (代码跟重定向一样只不过type改成chain)
        • redirectAction:重定向到另一个动作
          • 重定向到同一名称空间下的另一个动作
          • 重定向到不同名称空间下的另一个动作
    • 代码演示:
<package name="p1" extends="struts-default" namespace="/n1">
		<!-- 重定向到同一包内的不同动作方法 -->
		<action name="action1" class="com.lwb.web.action.Action3">
			<result name="success">/success.jsp</result>
		</action>
		<action name="action2">
			<result name="success" type="redirectAction">action1</result>
		</action>
</package>
	<package name="p2" extends="struts-default">
		<!-- 重定向到不同包的不同动作方法 -->
		<action name="action3">
			<result name="success" type="redirectAction">
		<!--使用的是注入的思想,在执行之重定向之前,会先获取这两个参数的值调用的就是setNamespace("/n2")和setActionName("action3")-->
				<param name="namespace">/n1</param>
				<param name="actionName">action1</param>
			</result>
		</action>
	</package>
  • 自定义结果类型:实现com.opensymphony.xwork2.Result接口或者继承自该接口的实现类org.apache.struts2.dispatcher.StrutsResultSupport。
    CAPTCHAResult.java
/**
 * 自定义结果类型
 * 	第一步:
 * 		编写一个普通类,继承自StrutsResultSupport的类,并且重写doExcecute方法
 * @author zhy
 *
 */
public class CAPTCHAResult extends StrutsResultSupport {
	
	//通过配置文件,调整生成图片的大小
	private int width;
	private int height;
	
	//Servlet的中原来怎么写,现在还怎么写
	protected void doExecute(String finalLocation, ActionInvocation invocation)
			throws Exception {
		/*
		 * 使用第三方生成验证码的jar包
		 * 	 1.拷贝ValidateCode.jar到工程lib目录
		 * 	 2.创建ValidateCode的对象
		 * 	 3.获取响应对象输出流
		 * 	 4.输出到浏览器
		 */
		//创建ValidateCode的对象
		//参数详解:1:图像宽度 2.图像高度 3.数字的格式 4.干扰线条数
		ValidateCode code = new ValidateCode(width,height,4,10);
		//获取响应对象
		HttpServletResponse response = ServletActionContext.getResponse();
		System.out.println("图片送到");
		//输出到浏览器
		code.write(response.getOutputStream());
	}

	public int getWidth() {
		return width;
	}

	public void setWidth(int width) {
		this.width = width;
	}

	public int getHeight() {
		return height;
	}

	public void setHeight(int height) {
		this.height = height;
	}	
}

CaptchaAction .java

public class CaptchaAction extends ActionSupport{

}

struts.xml

	<!-- 全局结果视图 -->
	<package name="myDefault" extends="struts-default" abstract="true">
		<!-- 自定义结果类型 
			  在包中配置的结果视图,是只能当前包和其子包中使用
		-->
		<result-types>
			<result-type name="captcha" class="com.lwb.web.result.CAPTCHAResult"></result-type>
		</result-types>
		  <global-results>
			<!-- 结果视图的查找顺序,先找当前动作类自己的,如果没有的,再去全局的结果视图中查找 -->
			<result name="success" type="captcha"> 
				<param name="width">240</param>
				<param name="height">40</param>
			</result>
		</global-results>
	</package>
	
	<package name="p3" extends="myDefault">
		<!-- 自定义结果类 -->
				<action name="captchaAction" class="com.lwb.web.action.CaptchaAction" >
			<!-- 写在action内部的结果视图,是只能当前动作类使用的 
			<result name="success" type="captcha">
				 配置图像的大小 
				<param name="width">240</param>
				<param name="height">40</param>
			</result>
			-->
		</action>
	</package>

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>

  </head>
  
  <body>
<form action="" method="post">
    		用户名:<input type="text" name="username"/><br/>
    		密码:<input type="password" name="password"/><br/>
    		验证码:<input type="text" name="valicateCode"/>
    			<img src="${pageContext.request.contextPath}/captchaAction.action" />
    		<br/>
    		<input type="submit" value="登录" />
    	</form>
  </body>
  
</html>
  1. 在动作类中访问Servlet的API
    第一种方式:使用ServletActionContext的对象(推荐)
public class Action4 extends ActionSupport{
	
	public String execute(){
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		ServletContext application = ServletActionContext.getServletContext();
		HttpSession session = request.getSession();
		System.out.println(request);
		System.out.println(response);
		System.out.println(application);
		System.out.println(session);
		return null;
		
	}

}

在这里插入图片描述
只有request被Struts2给包装了,其他的都是由服务器包装的

第二种方式:使用的是依赖注入的方式,把我们想要的对象注入进去

public class Action4 extends ActionSupport implements ServletRequestAware,ServletResponseAware,ServletContextAware{
	private HttpServletRequest request;
	private HttpServletResponse response;
	private ServletContext application;
	public String execute(){
//		HttpServletRequest request = ServletActionContext.getRequest();
//		HttpServletResponse response = ServletActionContext.getResponse();
//		ServletContext application = ServletActionContext.getServletContext();
		HttpSession session = request.getSession();
		System.out.println(request);
		System.out.println(response);
		System.out.println(application);
		System.out.println(session);
		return null;
		
	}

	@Override
	public void setServletContext(ServletContext application) {
		this.application = application;
	}

	@Override
	public void setServletResponse(HttpServletResponse response) {
		this.response = response;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.request = request;
	}

}

总结

今天学习简单的Struts的应用,路径的一些问题还是有点绕,要好好总结一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值