Struts2框架详解(一)

Struts2概述

  • Struts2框架是应用在JavaEE三层结构中的web层的框架。(专门针对web应用)
  • Struts2框架在Struts1和webwork基础上发展的全新框架。(webwork和struts1合作,借助struts1的名声,并更名为struts2)
  • Struts2解决的问题:

之前在web阶段,做一个用户管理功能(即增删改查功能),要做添加功能,需要创建一个添加的Servlet;要做一个修改功能,需要创建一个修改的Servlet。但是这样做个关键的缺点,如果功能很多,需要创建很多的Servlet,如果有一万个功能,就需要创建一万个Servlet,后期的维护特别麻烦。

针对这个问题出现了Struts2框架,Struts2框架是解决这个问题的方案中,比较优秀的一种方案。还是做一个用户管理功能(即增删改查功能),按照原始的方案,每个功能都需要建一个Servlet。每次访问Servlet,相当于向Servlet发送一个请求(请求指的是访问路径并实现内容)。而在Struts2中,用过滤器拦截下用户的这些请求,但拦截器不需要我们自己来写,Struts2已经帮我们封装好,我们只需要配置即可。同时我们针对不同的操作即不同的请求,在一个类(action类)中写不同的方法。而在过滤器中,根据不同的操作即不同的请求,执行类中的不同方法。比如做添加的操作,则执行类中的add方法;比如做修改的操作,则执行类中的update方法。这样可以解决多个Servlet的问题。

注意:在web阶段,我们写的类叫做Servlet;在Struts2中,我们写的类叫action。

 

Struts2入门案例:

第一步:导入jar包

  • 解压struts-2.3.24-all.zip,在lib中有所有的jar包,但不能把这些jar包都导入到项目中

  • 到apps目录里面,找到示例程序,从示例程序中的lib目录,复制jar包-----放到web项目下WebRoot--WEB-INF--lib

第二步:创建action类

第三步:配置action类访问路径

  • 创建struts2核心配置文件。核心配置文件的名称和位置是固定的。位置必须在src下面,名称必须为struts.xml
  • 引入dtd约束

  • action配置

第四步:配置Struts2过滤器

 

Struts2执行过程

以上述入门示例为例,画图分析:

 

查看源代码

查看Struts2过滤器源代码

org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

1.过滤器在服务器启动时候创建,创建过滤器时候执行init方法

在init方法中主要加载配置文件,包含自己创建的配置文件(web.xml和struts.xml)和struts2自带的配置文件

 

 

Struts2配置

1.Struts2的核心配置文件-----struts.xml

<struts>
	<package name="default" namespace="/" extends="struts-default">
		<!-- 访问名称 -->
		<action name="hello" class="cn.itcast.action.HelloAction">
			<!-- 配置方法的返回值页面 -->
			<result name="ok">/hello.jsp</result>
		</action>	
	</package>
</struts>

1.名称和位置是固定的

2.在配置文件中主要有三个标签:package标签、action标签、result标签

package标签

  • package标签类似于代码包,区别不同的action,要配置action,必须首先写package标签,在package里面才能配置action
  • name属性:name属性值跟功能本身没有关系的,在一个配置文件中可以写多个package标签,name属性值不能相同
  • extends属性:属性值是固定的:struts-default。写了这个属性之后,在package里面配置的类具有action功能
  • namespace属性:package标签里面的namespace属性值和action标签里面的name属性值构成访问路径

action标签

  • action标签配置action访问路径
  • name属性:package标签里面的namespace属性值和action标签里面的name属性值构成访问路径;在package标签里面可以写多个action标签,但是action标签的name属性值不能相同
  • class属性:action类全路径
  • method属性:比如在action类里面默认执行的方法是execute方法,但是在action类里面写其他的方法,让action里面多个方法执行,使用method进行配置

result标签

  • result标签根据action类的方法返回值,配置到不同的路径里面(页面或者其他action)
  • name属性:和方法的返回值相同

  • type属性:配置如何到路径中(请求转发或者重定向),type属性的默认值做请求转发

2.Struts2默认的常量位置(记住)

3.修改Struts2默认常量值

(1)常用的方式

在struts.xml中进行配置

(2)还有两种方式(了解)

  • 在src下面创建struts.properties,进行修改
  • 在web.xml进行配置

4.介绍最常用的常量

struts.i18n.encoding=UTF-8

(1)表单提交数据到action里面,在action可以获取表单提交数据

(2)表单提交数据有中文,有乱码问题,解决:post提交直接设置编码;get提交做编码转换

(3)如果在action获取表单通过post方式提交中文,中文乱码问题帮助解决了,不需要自己处理问题

 

 

Action编写方式

action编写有三种方式

  • 第一种:创建普通类,这个类不继承任何类,也不实现任何接口
package cn.itcast.action;

public class HelloAction {
	
	public String execute(){
		System.out.println("execute被执行了");
		return "ok";
	}

}
  • 第二种:创建类,实现接口Action

package cn.itcast.action;

import com.opensymphony.xwork2.Action;

public class UserAction implements Action {

	@Override
	public String execute() throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
}
  • 第三种:创建类,继承类ActionSupport,该类也继承了Action接口(一般使用)

package cn.itcast.action;

import com.opensymphony.xwork2.ActionSupport;

public class PersonAction extends ActionSupport {

}

 

Action的方法访问(重点)

访问action有三种方式实现

  • 第一种:使用action标签的method属性,在这个属性里面写执行的action的方法

(1)创建action,创建多个方法

package cn.itcast.method;

import com.opensymphony.xwork2.ActionSupport;

public class BookAction extends ActionSupport{
    //添加
	public String add(){
		System.out.println("add.........");
		return "none";
	}
	
    //修改
	public String update(){
		System.out.println("update........");
		return "none";
	}
}

(2)在action标签中,使用method属性进行配置

	<package name="method" namespace="/" extends="struts-default">
		<action name="add" class="cn.itcast.method.BookAction" method="add">
		</action>
		
		<action name="update" class="cn.itcast.method.BookAction" method="update">	
		</action>
	</package>

(3)在浏览器中输入访问路径,即package标签下namespace+action标签下name

缺陷:action每个方法都需要配置,如果action里面有多个方法,需要配置很多action

  • 第二种:使用通配符方式实现(重点)

在action标签里面的name属性,name属性值里面写通配符(*)

(1)创建action,创建多个方法

package cn.itcast.method;

import com.opensymphony.xwork2.ActionSupport;

public class BookAction extends ActionSupport{
    //添加
	public String add(){
		System.out.println("add.........");
		return "none";
	}
	
    //修改
	public String update(){
		System.out.println("update........");
		return "none";
	}
}

(2)在action标签中,使用通配符(*)进行配置

<package name="method" namespace="/" extends="struts-default">
	<!-- 
	name属性值里面写通配符(*)
	(1)执行action里面的add方法,访问book_add---使用book_*可以匹配到,*相当于编程add
	(2)执行action里面的update方法,访问book_update------使用book_*可以匹配到,*相当于编程update
	上面两个路径使用book_*都可以匹配到
	 -->
	<action name="book_*" class="cn.itcast.method.BookAction" method="{1}"></action>
</package>

(3)在浏览器中输入访问路径,book_add或者book_update

通配符(*)理解:表示匹配任意内容

-----比如访问update,*可以匹配到

-----比如访问add,*可以匹配到

通配符(*)使用示意图:

  • 第三种:动态访问实现(一般不用)

 

 

 

注意:

(1)如果action中方法有返回值,在配置文件中没有配置或者两者不匹配,出现错误

(2)在action中方法的返回值必须是String类型的,也可以没有返回值,在result标签中不需要配置(将返回值设置为“none”)

 

 

 

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值