Struts2是什么
概述
1. 什么是Struts2的框架
/* Struts2是Struts1的下一代产品,是在 struts1和WebWork的技术基础上进行了合并的全新的Struts 2框架。
* 其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。
* Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计
也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。
* 虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
2. Struts2是一个基于MVC设计模式的Web层框架
* MVC和JavaEE的三层结构
* MVC设计模式:是由一些网站的开发人员提出来的
* JavaEE三层结构:SUN公司为EE开发划分的结构
3. 常见的Web层的框架
* Struts1
* Struts2
* Webwork
* SpringMVC
4. Web层框架的特点
* 都是一个特点,前端控制器模式
* 记住:前端控制器(核心的控制器)
* Struts2框架前端的控制器就是过滤器
5. 前端控制器模式
* 传统的方式中,一个请求对应着一个servlet
* 在web层框架中,所有的请求会先经过一个前端控制器,在前端控制器中实现框架的
部分功能,具体的业务逻辑交给具体的Action
* 在struts中采用过滤器来实现前端控制器
快速搭建struts2框架
导包
1. 创建WEB项目,编写JSP的页面,编写超链接,点击超链接发送请求,请求服务器,让服务器的方法去执行!!
<h3>Struts2的入门程序</h3>
<a href="${ pageContext.request.contextPath }/hello.action">Struts2入门程序</a>
2. 下载Struts2的开发包
* https://struts.apache.org/ -- 官网地址
3. 解压struts-2.3.24-all.zip包
* 解压后会看到有包和一些文件,大家需要掌握包相关的信息
* apps -- Struts2框架提供了一些应用
* libs -- Struts2框架开发的jar包
* docs -- Struts2框架开发文档
* src -- Struts2框架源码
4. 引入需要开发的jar包
* Struts2框架的开发jar包非常多,但是不是所有都是必须要引入的,有一些必须要导入的jar包
这些jar包可以从Struts2框架提供的应用中找到。
* 大家可以打开apps目录,然后找到struts2-blank.war应用。war包和zip包的压缩格式是一样的
所以可以自己修改后缀名,解压。
* 导入解压后的jar包就可以了
书写Action类
/**
* Action类中的方法签名有要求的,必须这么做
* public 共有的
* 必须有返回值,必须String类型
* 方法名称可以是任意的,但是不能有参数列表
* 页面的跳转:
* 1. return "字符串"
* 2. 需要在strtus.xml配置文件中,配置跳转的页面
*/
public String execute(){
System.out.println("hello struts2");
return "success";
}
书写配置文件(src/struts.xml)
- 配置文件名称是struts.xml(名称必须是struts.xml)
- 在src下引入struts.xml配置文件(配置文件的路径必须是在src的目录下)
<?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="hello" namespace="/hello" extends="struts-default" >
<action name="HelloAction" class="cn.itheima.a_hello.HelloAction" method="hello" >
<result name="success" type="dispatcher" >/hello.jsp</result>
</action>
</package>
</struts>
配置核心过滤器到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架构(访问流程)
配置文件详解
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>
<!--
1.package: 将Action配置封装,就是在package中可以配置很多Action
* name : 给包起个名字,起到标识作用(不与其他包名重复即可)随便取
* namespace : 给action的访问路径中定义一个命名空间,跟<action>标签中的
name属性共同决定访问路径,默认为空
* extends : 继承一个指定包,只要继承了就具有该包的所有功能 struts-default 是必须要继承的
* abstract : 包是否为抽象的; 标识性属性(给开发者看的)标识该包不能独立运行.专门被继承
2.action: 配置action类
* name : <package>标签的namespace属性一起来决定访问路径的
* class : 配置Action类的全路径(默认值是ActionSupport类)
* method : 指定调用Action中的哪个方法来处理请求,如果不指定,默认值是execute
3.result : 配置结果
* name : 结果页面逻辑视图名称
* type : 指定调用哪一个result类来处理结果,默认使用转发
* 标签体 : 填写页面的相对路径
-->
<package name="hello" namespace="/hello" extends="struts-default" >
<action name="HelloAction" class="com.xiaoming.controller.HelloAction" method="execute" >
<result name="success" type="dispatcher" >/index.jsp</result>
</action>
</package>
</struts>
struts2常量配置
struts2默认常量配置位置
修改struts2常量配置方式
- 在src/struts.xml中(重要)
<constant name="key" value="value"></constant>
- 在src下创建struts.properties(了解)
//以键值对的形式
struts.i18n.encoding=UTF-8
- 在web.xml文件中(了解)
在StrutsPrepareAndExecuteFilter配置文件中配置初始化参数
<!-- 配置常量 在核心过滤器标签下 -->
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</innit-param>
常量配置文件加载顺序
常量配置
<!-- i18n:国际化. 解决post提交乱码 get乱码自己解决 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定反问action时的后缀名
http://localhost:8080/struts2_day01/hello/HelloAction.action
-->
<constant name="struts.action.extension" value="action"></constant>
<!-- 指定struts2是否以开发模式运行
1.热加载主配置.(不需要重启即可生效)
2.提供更多错误信息输出,方便开发时的调试
项目上线的时候设置为 false
-->
<constant name="struts.devMode" value="true"></constant>
* struts.serve.static.browserCache=true
-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭
* struts.configuration.xml.reload=false
-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用)
分模块开发配置
<!-- 引入其他struts配置文件 -->
<include file="cn/itheima/b_dynamic/struts.xml"></include>
<include file="cn/itheima/c_default/struts.xml"></include>
struts2配置进阶
动态方法调用
- ==通配符方式(重要)==
<?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="dynamic" namespace="/dynamic" extends="struts-default" >
<!--
通配符方式:
使用{1} 取出第一个星号通配的内容
访问的url :
http://localhost:8080/项目名/namespace/actionName_方法名.后缀
-->
<action name="Demo1Action_*" class="cn.itheima.b_dynamic.Demo1Action" method="{1}" >
<result name="success" >/hello.jsp</result>
</action>
</package>
</struts>
- 配置动态方法调用方法常量
<!-- 配置动态方法调用是否开启常量
默认是关闭的,需要开启(true)
访问的url : http://localhost:8080/项目名/namespace/actionName 方法名!后缀
不利于seo优化
-->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
struts2中的默认配置
<?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="default" namespace="/default" extends="struts-default" >
<!-- 找不到包下的action,会使用Demo2Action作为默认action处理请求 -->
<default-action-ref name="Demo2Action"></default-action-ref>
<!-- 常见默认值 -->
<!-- method属性:execute -->
<!-- result的name属性:success -->
<!-- result的type属性:dispatcher 转发 -->
<!-- class属性:com.opensymphony.xwork2.ActionSupport -->
<action name="Demo2Action" >
<result >/hello.jsp</result>
</action>
</package>
</struts>
Action类的三种写法
1. 配置文件学习完成,下面的重点是Action类的三种写法
/* 写一个POJO类
* 什么是POJO类,POJO(Plain Ordinary Java Object)简单的Java对象.
简单记:没有继承某个类,没有实现接口,就是POJO的类。
* 实现Action接口
* Action接口中定义了5个常量,5个常量的值对应的是5个逻辑视图跳转页面
(跳转的页面还是需要自己来配置),还定义了一个方法,execute方法。
* 大家需要掌握5个逻辑视图的常量(实际上就是一个字符串)
* SUCCESS -- 成功.
* INPUT -- 用于数据表单校验.如果校验失败,跳转INPUT视图.
* LOGIN -- 登录.
* ERROR -- 错误.
* NONE -- 页面不转向.
* 给我们提供上述的常量只是为了统一规范
* 继承ActionSupport类(开发中这种方式使用最多)
* 帮我们实现了 Validateable, ValidationAware, TextProvider, LocaleProvider 等接口
* 如果我们需要用到这些接口的实现时,不需要自己来实现了