Struts2入门

我们先搭建一个入门案例来了解一下Struts2

  • 首先我们需要搭建我们的开发环境:

  1. 将我们需要的jar包拷贝到项目的lib目录下
  2. 在项目的最顶层(也就是src下)新建一个struts.xml文件  -->一定要注意创建的位置和命名格式!!(ps:其实名字可以改,但是一般大家都这样写,约定大于编码嘛,所以我们入乡随俗)
  3. 在web.xml中配置一个Struts2已经写好的过滤器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>01_Struts2Template</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <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>
</web-app>
最后我们把项目部署上然后启动tomcat服务器,只要不报错那么我们的环境就搭建好了

  • 然后搭建再写入门案例

    第一步:新建一个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>Struts2入门案例</title>
</head>
<body>
	<!-- hello.action:扩展名为.action是struts2框架默认处理的url后缀,当然什么也不写也可以! -->
	<a href="${pageContext.request.contextPath }/hello.action">以.action结尾</a>
	<a href="${pageContext.request.contextPath }/hello">不以.action结尾</a>
</body>
</html>

     第二步:在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>
	<!-- 覆盖常量  修改成以.do结尾的 -->
	<constant name="struts.action.extension" value="do"></constant>
	
	<!-- 
		namespace:命名空间 
		访问路径 = 名称空间 +动作名称
		
		namespace的默认值:
			1.不写该属性
			2.写了该属性,取值是一个"";
				注意:默认值不是/ !!!
	-->
	<package name="p1" extends="struts-default" namespace="/">
		<!-- 
			name:对应请求的地址   注意:没有后缀,和页面上是否写了.action没有关系!
			class:动作类全名,指定的一个动作类  (class有一个默认动作类是:com.opensymphony.xwork2.ActionSupport
										是在struts-default.xml中定义的)
			method:对应请求需要执行的动作方法 (默认动作方法是public String execute(){})
		 -->
		<action name="hello" class="com.chh.action.HelloAction" method="sayHello">
			<!-- 配置结果视图 -->
			<result name="success">/success.jsp</result>
		</action>
	</package>
</struts>

    第三步:新建我们的动作类和动作方法

package com.chh.action;
/**
 * 动作方法
 * @author Administrator
 *
 */
public class HelloAction {
	/**
	 * 动作方法书写的要求:
	 * 1.public的
	 * 2.返回值是String类型
	 * 3.没有任何参数
	 */
	
	public String sayHello(){
		return "success";   //对应结果视图的name值
	}
}
     最后一步:新建结果视图(就是执行完动作方法要去的某个页面)
<%@ 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>Insert title here</title>
</head>
<body>
	执行成功!
</body>
</html>
我们访问一下,可以看到已经成功了


虽然我们成功的在struts2的环境下把这个例子跑起来了,但是至于它是怎么运行的,内部流程我们都是处于懵逼状态的,下面我们看一张图,了解下他的内部运行流程


  • Struts2配置文件
  1. 加载时机:当应用被tomcat加载的时候,struts2的配置文件就被加载过了。
  2. 加载顺序:
    顺序配置文件名所在位置我们能不能修改
    1

    default.properties

    org/apache/struts2/default.properties不能修改
    2

    struts-default.xml

    在struts的core核心jar包. 不能修改
    3

    strtuts-plugin.xml

    struts2提供的插件jar包中

    不能修改
    4

    struts.xml

    我们的应用中可以修改
    5

    struts.properties

    我们的应用中可以修改
    6

    web.xml

    我们的应用中可以修改,在过滤器中进行配置Struts2框架提供的常量

在这里我们需要注意一下:

  1. Struts2提供了两种配置的方式。一种是key=value的方式,即使用.properties文件。另一种是xml文件配置。一般我们推荐使用xml文件(ps:因为它能描述层级关系)。
  2. 当多个配置文件中,有相同的参数,后面的会把前面的值给覆盖了。

  • Struts2框架提供的常量
  1. 常量定义在了default.properties配置文件中,体现形式都是key=value。所有的struts2应用都会用到这些常量。

     2.一般情况下我们有三种方式覆盖这些常量(在struts.xml中覆盖,创建struts.properties覆盖,在web.xml中配置过滤器参数)

  • 在struts.xml中使用<constant name="" value=""></constant>元素覆盖
<!-- 覆盖常量  修改成以.do结尾的 -->
	<constant name="struts.action.extension" value="do"></constant> 
  • 创建struts.properties文件覆盖(src下)    

  • 在web.xml中配置过滤器参数进行覆盖


  • struts.xml中的主要元素:

 

1、package元素

1.1、作用:

    在struts2的配置文件中引入了面向对象思想,使用了分包管理。易于管理动作类。便于模块化开发动作类。

 

1.2、属性:

    name:包的名称。必须写。且必须唯一。

    extends:一般情况下需要继承struts-default包,但不是必须的。不过如果不继承的话,将无法使用struts2提供的核心功能。

    struts-default.xml中定义着struts-default这个包。而struts-default.xml是在我们的struts.xml加载之前加载。

    abstract:把包声明为抽象包,抽象包就是用来被继承的。只要是没有<action>元素的包,就可以声明为抽象包。

    namespace:名称空间。

    名称空间 + 动作名称 = 访问路径

1.3、packege中的namespace详解

   namespace的默认值:

  1. 不写该属性
  2. 写了该属性,取值是一个"".

注意:默认值不是/

动作类的搜索顺序:

2、action元素

2.1、作用:配置动作用的。

2.2、属性:

  • name:动作名称

 

  • class:动作类全名。默认的动作类是:com.opensymphony.xwork2.ActionSupport,是在struts-default.xml中定义的

 

  • method:动作类中的方法名称。默认是public String execute(){}

要求:

      1.public的

  1. 返回值必须是String
  2. 没有参数

 

 

2.3、动作类

  1. 方式一:动作类就是一个POJO(Plain Old Java Object 原始的java对象),非常简单的javabean。
  2. 方式二:动作类实现com.opensymphony.xwork2.Action接口。

      常量:给动作方法返回值用的。用常量可以使你的应用规范和统一。

    3.方式三:动作类继承com.opensymphony.xwork2.ActionSupport 推荐使用

 

 

2.4、动作的访问

  • 使用通配符:
<package name="user" extends="struts-default" namespace="/user">
		<!-- <action name="addUser" class="com.chh.action.UserAction.UserAction" method="addUser">
			<result name="success">/addUser.jsp</result>
		</action>
		
		<action name="deleteUser" class="com.chh.action.UserAction.UserAction" method="deleteUser">
			<result name="success">/deleteUser.jsp</result>
		</action>
		
		<action name="updateUser" class="com.chh.action.UserAction.UserAction" method="updateUser">
			<result name="success">/updateUser.jsp</result>
		</action>
		
		<action name="selectUser" class="com.chh.action.UserAction.UserAction" method="selectUser">
			<result name="success">/selectUser.jsp</result>
		</action> -->
		
	    <action name="*" class="com.chh.action.UserAction.UserAction" method="{1}">
			<result name="success">/{1}.jsp</result>
		</action> 
  • 升级版:(  绝对匹配优先。使用通配符的按照在配置文件中的先后顺序进行匹配的。)
<!-- 升级版
			{1}代表下划线左边的 *
			{2}代表下划线右边的 *
		 -->
		<!-- <action name="*_*" class="com.chh.action.UserAction.*Action" method="{1}{2}">
			<result name="success">/{1}{2}.jsp</result>
		</action> -->
  • 结果类型视图(逻辑结果视图)

 

1、result元素

  • 作用:为动作指定结果视图
  • 属性:name:逻辑视图的名称,对应着动作方法的返回值。默认值是success。 
  • type:结果类型,指的就是用什么方式转到定义的页面。默认是dispatcher。

 

2、result元素中type的取值

type属性的取值在struts-default.xml中定义着。

  • 常用结果类型介绍:

 

  • dispatcher:(默认值)使用请求转发,转向一个页面。
  • redirect:使用重定向,转向一个页面。

 


 

redirectAction:注意:使用的是重定向。

  1. 重定向到另一个相同名称空间的动作。
<package name="p1" extends="struts-default">
		<action name="action1" class="com.chh.Action.ActionDemo1">
			<!--在不指定type属性时,默认使用的是请求转发  -->
			<!--
				redirectAction:使用重定向,重定向到另一个相同名称空间的动作
				即重定向到相同包下的另一个动作(action)
			  -->
		    <result name="success" type="redirectAction">action2</result> 
		
		</action>
		
        <action name="action2">
			<result>/error.jsp</result>
		</action> 
	</package> 

 2.重定向到不同名称空间的动作

<package name="p1" extends="struts-default">
		<action name="action1" class="com.chh.Action.ActionDemo1">
		    <!-- 
				访问不同包下的动作: /n2下的动作action3,那个直接指定的方式无法访问
				必须使用<result>元素下的子元素<param name="">value</param>
				name属性:参数名称
				value:参数的值
					参数的名称要注意大小写!!!
					
				type="chain"代表请求转发。,配置信息和重定向一模一样
			 -->
			<result name="success" type="redirectAction">
				<param name="namespace">/n2</param>
				<param name="actionName">action3</param>
			</result>
		</action>
	</package>
	
	<package name="p2" extends="struts-default" namespace="/n2">
		<action name="action3">
			<result>/demo.jsp</result>
		</action>
	</package> 

3、result元素中param子元素

在转发或者重定向到不同包下的动作时,都用到了result元素的子元素param。

param元素的作用:依赖注入(Dependence Injection)思想

我们通过struts-default.xml中的resultTypes元素中配置可以看出,每个结果类型视图其实都是靠一个类来实现的。而param元素就是将配置的参数,注入到该类中。

调用的是对应类的setter方法进行注入的。

 


  •  在动作类中访问Servlet的API


    使用ServletActionContext类



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值