1、struts2概述
1. struts2框架应用javaEE三层结构中web层框架
2. struts2框架在struts1和webwork基础之上发展的一个全新的框架,此处注意struts2和struts1用法是完全不一样的
3. struts2解决的问题:在以前执行一个管理系统中的增删改查操作的时候,需要为每一个增删改查操作创建一个Servlet,如果功能很多,需要创建很多的Servlet,这会造成维护的不方便,而在struts2中可以很好的解决。struts2执行过程如下:
4. struts2版本:struts2里面有很多的小版本
5. web层常见框架
(1)struts2
(2)SpringMVC
2、struts2框架入门
第一步:导入jar包
(1)在struts包中,在lib中有jar包,不能把这些jar都导入到项目中,因为有一些暂时用不到,导入进去会出错
(2)到apps目录里面,这里面放的都是示例程序,找到示例程序,从示例程序里面复制jar包到工程里面
第二步:创建action
(1)在Servlet中,每次访问Servlet的时候,都会执行service方法
(2)现在在struts2中,访问action,每次访问action的时候,都默认执行execute方法-------------配置action类的访问路径
第三步:配置action访问路径
(1)创建struts2核心配置文件,配置文件名称和位置是固定的,位置必须在src下面,名称是struts.xml
(2)引入dtd约束
在struts2包apps示例程序中src目录下Struts.xml中可以直接把约束复制下来
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd">
|
(3)action的配置
<?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> <package name="hellodemo" extends="struts-default" namespace="/"> <!--name:访问名称url --> <action name="hello" class="com.test.action.HelloAction"> <!-- 配置execute方法的返回值到不同的页面中去,/hello.jsp结果返回到hello.jsp页面中 --> <result name="ok">/hello.jsp</result> </action> </package> </struts> |
访问路径:http://localhost:8080/struts2_day01/hello.action
这个时候访问,会报404错误,因为没有配置过滤器
(4)配置struts2过滤器的配置
在web.xml文件中配置过滤器
<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> |
使用struts2可以节省许多代码,但是需要写配置文件
3、struts2基本执行过程
执行图示:
执行过程中,注意反射部分的代码。
4、查看源代码
过滤器:
1. 过滤器在服务器启动的时候创建,创建过滤器时候执行init()方法 (1)在init方法中主要加载配置文件 -----包含自己创建的配置文件和struts2自带的配置文件 **struts.xml **web.xml
|
5、struts2相关配置(1)Struts2的核心配置文件
1. 名称和位置都是固定的,名称是struts.xml 位置在src下面
2. 在配置文件中主要三个标签 package、action、result、标签里面的属性
Package标签
1. 类似于代码包,区别不同的action,要配置action,必须首先写package标签,写了package标签,在package里面才能配置action 2. Package标签属性 (1)name属性 name属性值跟功能本身没有关系的 在一个配置文件中可以写多个package标签,name属性值不能相同的
(2)extends属性 <package name="hellodemo" extends="struts-default" namespace="/"> 属性值是固定的,structs-default 写了这个属性值之后,在package里面配置的类具有action功能
(3)namespace属性 --- namespace属性值和action标签里面的name属性值构成访问路径
|
Action标签
1. action标签配置action访问路径
2. Action标签属性 (1)name属性 --namespace属性值和action标签里面的name属性值构成访问路径 --可以在package标签里面写多个action标签,但是action的name属性值不能相同的
(2)class属性 --action全路径 (3)method属性 在action里面默认执行execute()方法,但是在action里面也写了其他的方法,如果让action里面的多个方法执行,使用method进行配置 |
Result标签
1. 根据action的方法返回值,配置到不同的路径里面
2. Result标签属性 (1)name属性 --和方法返回值一样
(2)type属性 --配置如何到路径中(转发或者重定向) --type属性值默认是做转发操作
|
(2)Struts常量配置
1. struts框架,帮我们实现一部分功能,struts里面有常量,在常量里面封装一部分功能。Stmts2的这些常量大多在默认的配置文件中已经配置好,但根据用户需求的不同,开发的要求 也不同,可能需要修改这些常量值,修改的方法就是在配置文件对常量进行重新配置。
2.struts默认的常量位置(记住)
3. 修改structs2默认常量值
(1)常用的方式
在struts.xml中进行配置
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
(2)还有两种方式(了解)
<1>在src下面创建struts.properties,进行修改。struts.properties文件是一个标准的properties文件,其格式是key-value对,即每个key对应一个 value, key是Struts2框架中的常量,而value则是其常量值。
<2>在web.xml进行配置,在web.xml文件中通过< imt-param>元素配置常量
4.介绍几种最常用的常量
Struts.i18n.encoding=UTF-8 (1)表单提交数据到action里面,在action里面可以获取表单提交数据 (2)表单提交数据有中文,有乱码问题,解决方式: Post 提交直接设置编码 Get 提交做编码转换 (3)如果在action获取表单通过post方式提交中文,中文乱码问题帮我们解决了,不需要自己处理问题 |
6、分模块开发
在实际开发中,我们通常很多人都需要修改同一个配置文件就是struts.xml。因为这个文件是 Stmts2的核心配置文件。而且这个文件一旦改错了一点,那么会导致整个项目都会出现问题,所以 Struts2提供了<include>标签解决这个问题。Stmts2允许将一个配置文件分解成多个配置文件,从而提高配置文件的可读性。Struts2默认只加载src下的struts.xml文件,但一旦通过多个xml文件来配置 Action,就必须通过struts.xml文件来包含其他配置文件。
解决方式:
1. 单独写配置文件,把配置文件引入到核心配置文件中
<!--不指定路径默认在src下时的方式-->
〈include file=nstruts-shop.xml/>
<include file="nstruts-user.xml"/>
<include file="nstruts-shoppingcart.xml"/>
<!-- 配置文件在具体包中时的方式 -->
<include file="com/test/action/struts-product.xml">
</struts>
7、Action编写方式
1. action 编写有三种方式 第一种,创建普通类,这个不继承任何类,不实现任何接口
第二种:创建类,实现接口action
Action接口位于xwork2包中。这个接口里只定义了 一个execute()方法,该接口的规范规定了 Action处理类应该包含一个execute()方法,该方法返回一 个字符串。除此之外,该接口还定义了 5个字符串常量,它们的作用是统一 execute方法的返回值。接口中提供了 5个己经定义的常量如下:
:success,代表成功 :none,代表页面不跳转 :error,代表跳转到错误页面 :input,数据校验的时候跳转的路径 :login,用来跳转到登录页面
第三种:创建类,继承类ActionSupport(一般使用)
ActionSupport类本身实现了Action接口,是Struts2中默认的Action接口的实现类,所以继承ActionSupport 就相当于实现Action 接口。ActionSupport 类还实现了Validateable、ValidationAware、TextProvider、LocaleProvider和Serializable等接口,来为用户提供更多的功能。ActionSupport类中提供了许多默认方法,这些默认方法包括获取国际化信息的方法、数据校验的方法、默认的处理用户请求的方法等。实际上,ActionSupport类是Struts2默认的Action处理类, 如果让开发者的Action类继承该ActionSupport类,则会大大简化Action的开发。
|
8、访问action的方法
1. 有三种方式实现 第一种:使用action标签的method属性,在这个属性里面写执行的action的方法 第二种:使用通配符方式实现 第三种:动态访问实现(一般不用) 2. 错误演示 (1)如果action方法有返回值,在配置文件中没有配置,出现错误
(2)在action里面的方法有返回值,如果有返回值时候,返回值类型必须是String (3)Action里面的方法可以没有返回值,没有返回值的时候,在result标签中不需要配置 --把方法写成void --让返回值,返回“none”
|
* 使用action标签method属性
其实我们学过在〈action〉的标签中有一个属性method,通过method的配置来指定Action中的某个方法执行
1.在action方法中编写几个方法
3. 使用method进行配置
但是这种方式我们会发现,同一个Action类就被配置了很多次,只是修改了后面的method的值。那么能不能配置简单化呢?也就是一个Action类,只配置一次就好了?这个时候我们就需要使 用通配符的配置方式了
* 使用通配符实现(重点掌握)
1. 在action标签里面name属性,name属性值里面写符号 * 星号
(1)*号理解:
比如访问hello*可以匹配到
比如访问add *可以匹配到
name属性值里面写符号*
(1)执行action里面的add方法,访问book_add,使用book_*可以匹配到,*相当于变成add
(2)执行action里面的update方法,访问book_update,使用book_*可以匹配到,*相当于变成update
上面两个路径使用book_* 可以匹配到
method属性写*值
图解: