什么是struts2
struts2框架是一个基于MVC设计模式的web层应用框架,它本质上相当于一个servlet,在MVC设计模式中,struts2作为控制器来建立模型与视图之间的数据交互,Struts2以webwork为核心,采用拦截器的机制来处理用户的请求,这样就使得业务逻辑器能够与servlet完全分开。
使用struts2的优势
- 自动封装参数
- 参数校验
- 结果的处理(转发|重定向)
- 国际化
- 显示等待页面
- 防止表单重复提交
- 提供Exception处理机制
- 有ajax支持
struts2基于前端控制器的实现模式
在传统的开发方式中,有一次请求就会对应一个servlet,这样就会有多个servlet。而struts2会将所有请求都先经过一个前端控制器,经过前端控制器实现部分功能,剩下的交给各个Action中,所有的请求都会经过前端控制器发送到Action中。那么用什么方式来实现前端控制器呢?最好的方式就是通过实现一个过滤器,这样所有的请求都可以被拦截。
struts2入门程序
struts2包的说明
struts导入约束
导入约束地址
- 导包
- 配置前端控制器,拦截所有请求
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<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>
- 编辑一个Action类
package com.zillion.action;
public class testAction {
/**
* execute是struts默认的执行方法
* @return
*/
public String execute(){
System.out.println("测试Action");
return "success";
}
}
- 编写struts.xml的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用于定义包的配置,该包中包含了多个Action请求。
name属性: 给包起个名字,起到标识作用.随便起.不能其他包名重复.
namespace属性:给action的访问路径中定义一个命名空间
extends属性: 继承一个 指定包
abstract属性:包是否为抽象的; 标识性属性.标识该包不能独立运行.专门被继承
-->
<package name="test" extends="struts-default" namespace="/">
<!-- action元素:配置action类
name:决定了Action的访问路径名
class:Action的完整类名
method:指定调用Action中的哪个方法来处理请求
-->
<action name="testAction" class="com.zillion.action.testAction" method="execute">
<!--
result元素:结果配置
name:标识结果处理的名称.与action方法的返回值对应.
type:指定调用哪一个result类来处理结果,默认使用转发.
标签体:填写页面的相对路径
-->
<result name="success" type="dispatcher">/hello.jsp</result>
</action>
</package>
</struts>
- 前端页面
<body>
<a href="${pageContext.request.contextPath}/testAction.action">测试代码</a>
</body>
点击超链接会成功跳转到hello.jsp页面
struts2的执行流程
1. 用户浏览地址,从客户端发送请求。
2. 经过struts2的前端控制器进行拦截,然后执行默认的拦截器
3. 然后跳转到执行Action类中的方法
4. 执行完毕后,会根据方法的返回值去进行相应的页面跳转
struts的常量配置
- 在struts.xml文件中使用constant元素配置常量,放在struts元素内
<!-- i18n:国际化. 解决post提交乱码 -->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定反问action时的后缀名
http://localhost:8080/struts2_day01/hello/HelloAction.do
-->
<constant name="struts.action.extension" value="action"></constant>
<!-- 指定struts2是否以开发模式运行
1.热加载主配置.(不需要重启即可生效)
2.提供更多错误信息输出,方便开发时的调试
-->
<constant name="struts.devMode" value="true"></constant>
- 在struts.properties中配置常量信息
### 设置默认的编码集utf-8
struts.i18n.encoding=UTF-8
### 设置访问的后缀名或取消后缀名
struts.action.extension=action,,
### 设置不使用开发模式
struts.devMode=false
分模块开发
在实际开发中,多个人会开发不同的模块,每个人就会有不同的struts.xml配置文件,为了导致所有人使用相同的struts配置文件,将主配置文件进行覆盖。所以就可以让每个人开发不同的struts.xml配置文件,最后项目使用大的struts配置文件,在大的配置文件中,引入每个模块的配置文件即可
<!-- file填入要引入的struts配置文件,具体是包名加配置文件 -->
<include file="cn/itheima/c_default/struts.xml"></include>
struts2中的默认配置信息
method属性:execute
result中的name:success
result中的type:dispatcher