Struts2 入门

本文包括:

1、Struts 2 概述

2、Struts 2 入门

3、Struts 2 的执行流程

4、Struts 2 的常见配置

5、struts.xml 配置

6、Struts 2 常量配置

7、Action 类的三种写法

8、Action 的访问(重难点)

1、Struts 2 概述

Struts2是一个基于MVC设计模式的Web应用框架它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。

Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。

常见的web层框架【SpringMVC、Struts2】都是基于前端控制器模型的。

前端控制器模式:集中统一化对外的请求接口,便于更好的封装内部逻辑

2、Struts 2 入门

本节需要创建一个新的WEB项目并完成Struts 的配置以及Action编写。【官网】

1、创建第一个项目--了解Struts2的开发包

2、创建第一个项目--导入包(13个基本jar包)

3、创建第一个项目--创建JSP页面--提供一个执行Action类的接口

<%@ 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>
<h1>Struts2的入门</h1>
<h3><a href="${pageContext.request.contextPath }/hello.action">Struts2的入门</a></h3>
</body>
</html>

4、创建第一个项目--编写Action类--处理用户请求,并相应

package com.itheima.struts.demo;
/**
 * Struts2d的入门的Action类
 * @author 93615
 */
public class HelloAction {
	/**
	 * 提供一个方法 方法签名固定 返回值是String类型 方法名是execute 在这个方法中不能传递参数
	 * @return
	 */
	public String execute(){
		System.out.println("HelloAction执行了——————");
		return null;
	}
}

5、创建第一个项目--对Action进行配置--在src下创建一个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>
	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
	<!-- 配置Struts2的包  -->
	<!-- name:包名不可重复
		 struts-default:Struts2中的一个配置文件,规定了Action的基本功能
		 extends:扩展继承了(struts-default)Action的基本功能
		 namespace:-->
	<package name="p1" extends="struts-default" namespace="/">
		<!-- 配置Action -->
		<action name="hello" class="com.itheima.struts.demo.HelloAction"></action>
	
	</package>
	
</struts>

 6、创建第一个项目--添加前端过滤器

这一步是必须要做的操作,这是 Struts 2 核心的控制器。Struts 2 的前端控制器就是一个过滤器,需要在 web.xml 中进行配置。

  <!-- 配置Struts2的核心过滤器 -->
  <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>

 6、创建第一个项目--改写Action、增加跳转

public String execute(){
	System.out.println("HelloAction执行了——————");
	return "success";
	<package name="demo1" extends="struts-default" namespace="/">
		<!-- 配置Action================ -->
		<action name="hello" class="com.itheima.action.HelloAction" >
			<!-- 配置页面的跳转=========== -->
			<result name="success">/demo/success.jsp</result>
		</action>
	</package>

 3、Struts 2 的执行流程

1、具体执行的流程:

启动服务器的时候核心过滤器会被创建会加载各种配置文件包括(struts.xml)

打开Jsp页面--->点击超链接--->请求提交到服务器端(/hello.action)

请求经过 Struts 2 的核心过滤器(StrutsPrepareAndExecuteFilter)在过滤器实现了很多功能的处理

根据struts.xml 的配置文件找到请求路径所对应具体的类,通过反射的方式让方法执行。

根据返回字符串进行跳转操作

总结: 当用户访问某一个Action时,先经过核心过滤器(前端控制器),在核心过滤器中执行一组拦截器(这组拦截器实现部分功能),根据Action的name找到目标Action类,执行Action类通过反射执行函数返回字符串结果,根据绑定值进行页面跳转

 2、分析Struts2的执行流程

4、Struts 2 的常见配置

 1、 XMl的提示问题--配置XML提示方便代码编写

2、配置文件的的加载顺序

我们要了解框架的工作原理就要理清楚这些相关配置文件的加载细节,掌握加载了哪些个配置文件,以及它的作用是什么。

Struts2 框架的核心是 StrutsPrepareAndExecuteFilter 过滤器,该过滤器会通过预处理加载核心的配置文件,并让部分拦截器执行工作,如图就是StrutsPrepareAndExecuteFilter 类加载的一些配置文件的顺序。

 

 

[1] init_DefaultProperties();----------加载default.properties   框架的各种常量

[2] init_TraditionalXmlConfigurations();----------加载struts-default.xml,struts-plugin.xml,struts.xml   拦截器 插件 配置

[3] init_LegacyStrutsProperties();----------加载用户自定义的 struts.properties.

[5] init_CustomConfigurationProviders();----------加载用户自定义配置提供类

[6] init_FilterInitParameters() ;----------加载web.xml中过滤器初始化参数

[7] init_AliasStandardObjects();----------加载Bean对象

配置文件加载顺序以及操作总结

  • default.properties  位于 Struts 2 的核心包下 org/apache/struts2/default.properties ,都是常量。

  • struts-default.xml  位于 Struts 2 的核心包下 struts2 框架的核心功能都是在该配置文件中配置的。默认值,不能修改!

  • struts-plugin.xml   插件

  • struts.xml              在 src 的目录下,代表用户自己配置的配置文件   开发中基本上都在该配置文件中配置常量。

  • struts.properties   可以配置常量,但基本不会在该配置文件中配置。

  • web.xml                可以配置常量,但基本不会在该配置文件中配置。

  • 注意三种文件都可以配置常量 且后加载的配置文件会覆盖掉之前加载的配置文件的常量的值

5、struts.xml 配置

1、package 标签的配置:标签称为包,为了更好地管理Action配置

属性:

name 包名称,要求是唯一的,管理action配置

extends 继承,可以继承其他功能的包,继承后也就包含了其他包的功能,一般是继承 struts-default

namespace 名称空间,与<action>标签中的name属性共同决定访问路径  “”  “/”  “/aaa”

abstract 是否可以被继承, 用于控制是否可以被其他包的继承(true:可以继承)

2、action 标签的配置:action 标签配置Action类

属性:

name 与namspace共同决定访问路径

class Action类的全路径

method 执行Action中的哪个方法的方法名,默认execute

converter 用于设置类型转换器

3、result 标签:接收action 类中方法执行返回的结果跳转页面

name  跳转页面名称

type  跳转页面方式(默认值转发)

4、include 标签:引入多个 struts 的配置文件(分模块开发)

随着系统中 Action 的数量增加,导致 struts.xml 配置文件变得非常臃肿。我们可以将一个 struts.xml 配置文件分解成多个配置文件,然后在 struts.xml 文件中包含其他配置文件。可以在<package>标签中,使用<include>标签来引入其他的 struts_xx.xml 的配置文件

<include file="com/itheima/struts/demo/struts-demo1.xml"></include>

6、Struts2的常量配置

在Struts2的框架中提供了非常多的常量(在default.properties

例如:

struts.i18n.encoding=UTF-8    Struts2所有的post请求的中文乱码不用处理

struts.action.extension=action,,  Struts2请求的默认扩展名

struts.serve.static.browserCache=true 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭

struts.configuration.xml.reload=false 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用)

struts.devMode = false 开发模式下使用,这样可以打印出更详细的错误信息

1、在Struts2如果要求更改某些常量则可以在三个位置进行更改

  • struts.xml
  • struts.properties
  • web.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>
	<!-- 配置Struts2常量 :更改Action后缀-->
	<constant name="struts.action.extension" value="abc"/>
	<!-- Struts2为了管理Action的配置,通过包进行管理 -->
	<!-- 配置Struts2的包  -->
	<package name="demo" extends="struts-default" namespace="/">
		<!-- 配置Action -->
		<action name="hello" class="com.itheima.struts.demo.HelloAction">
			<!-- 配置转发 -->
			<result name="success">/demo1/success.jsp</result>
		</action>
	</package>
</struts>
在src下新建文件 struts.properties 进行设置

struts.action.extension=abc
<!-- 配置Struts2的核心过滤器 -->
  <filter>
  	<filter-name>struts2</filter-name>
  	<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
 	<!-- 修改常量 -->
 	<init-param>
		<param-name>struts.action.extension</param-name>
		<param-value>xyz</param-value>
 	</init-param>
  </filter>
  <filter-mapping>
 	 <filter-name>struts2</filter-name>
 	 <url-pattern>/*</url-pattern>
  </filter-mapping>

 

Action的写法

编写Action>>配置Action(struts.xml)将Action的name和类绑定.et>>调用name.acction

POJO

public class ActionDemo01 {
	public String execute(){
		System.out.println("ActionDemo01执行了----POJO");
		return null;
	}
}

实现接口Action

/**
 * 实现接口
 * 提供了5个常量(5个逻辑视图名称)
 * SUCCESS  :成功
 * ERROR    ;失败
 * LOGIN    ;登陆出错
 * INPUT    ;表单校验的时候出错
 * NONE
 * @author 93615
 *
 */
public class ActionDemo02 implements Action{

	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo02--实现接口");
		return null;
	}
	
}

继承ActionSupport类(推荐第三种方式)

public class ActionDemo03 extends ActionSupport{
	@Override
	public String execute() throws Exception {
		System.out.println("ActionDemo03--继承ActionSupport");
		return NONE;
	}
}
<struts> 
		 
	<package name="p01" extends="struts-default" namespace="/">
		<!-- 配置Action -->
		<action name="hello01" class="com.itheima.struts.demo02.ActionDemo01"></action>
		<action name="hello02" class="com.itheima.struts.demo02.ActionDemo02"></action>
		<action name="hello03" class="com.itheima.struts.demo02.ActionDemo03"></action>
		
	</package>
	
</struts>

 Action访问

 通过method

 通过通配符

动态方法访问

<h1>Action 访问</h1>
<h3>通过method方法</h3>
<a href="${pageContext.request.contextPath }/userFind.action">查询用户</a><br/>
<a href="${pageContext.request.contextPath }/userUpdate.action">修改用户</a><br/>
<a href="${pageContext.request.contextPath }/userDelete.action">删除用户</a><br/>
<a href="${pageContext.request.contextPath }/userSave.action">保存用户</a><br/>

<h3>通过通配符方法</h3>
<a href="${pageContext.request.contextPath }/product_find.action">查询商品</a><br/>
<a href="${pageContext.request.contextPath }/product_update.action">修改商品</a><br/>
<a href="${pageContext.request.contextPath }/product_delete.action">删除商品</a><br/>
<a href="${pageContext.request.contextPath }/product_save.action">保存商品</a><br/>

<h3>通过动态方法访问</h3>
<a href="${pageContext.request.contextPath }/customer!find.action">查询用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!update.action">修改用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!delete.action">删除用户</a><br/>
<a href="${pageContext.request.contextPath }/customer!save.action">保存用户</a><br/>
<struts> 
	<!-- 开启动态方法访问 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
	<package name="p03" extends="struts-default" namespace="/">
		
		<!-- 配置Action -->
		<action name="userFind" class="com.itheima.struts.demo03.UserAction" method="find"></action>
		<action name="userUpdate" class="com.itheima.struts.demo03.UserAction" method="update"></action>
		<action name="userDelete" class="com.itheima.struts.demo03.UserAction" method="delete"></action>
		<action name="userSave" class="com.itheima.struts.demo03.UserAction" method="save"></action>
		
		
		<!-- 通配符配置 -->
		<action name="product_*" class="com.itheima.struts.demo03.ProductAction" method="{1}"></action>
		
		<!-- 动态路径配置 -->
		<action name="customer" class ="com.itheima.struts.demo03.CustomeAction"></action>
	</package>
	
</struts>
public class UserAction extends ActionSupport{
	public String find(){
		System.out.println("find---");
		return NONE;
	}
	public String delete(){
		System.out.println("delete---");
		return NONE;
	}
	public String update(){
		System.out.println("update---");
		return NONE;
	}
	public String save(){
		System.out.println("save---");
		return NONE;
	}
}

CRM实例

 

 

2、Struts 数据封装、结果页面配置。

3、Struts 值栈、OGNL表达式。

4、Struts 标签库

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值