struts2
什么是struts2
是Web层的一个框架,对Web层的功能进行了封装。常见的web层框架struts1、webWork、springMVC
struts2的作用
-
接收页面的请求数据
-
封装数据传递参数
-
接收结果数据到域对象
-
域对象到页面展示数据
struts2的文件加载顺序
-
struts2的前端控制器(StrutsPreparedAndExecuteFilter)的init方法
init方法:服务器启动执行 执行一次
主要作用: 用来加载整个struts2的配置文件的
-
struts2自动写好的配置文件(执行顺序由上到下)
- default.properties:已经配置好的键值对信息(action的后缀名地址访问 上传文件的大小控制…)
- struts-default.xml:struts2的默认包:struts-default,存在大量拦截器
- struts-plugin.xml:struts2整合spring需要用到的一个配置文件
-
自己创建或书写的配置文件(执行顺序由上到下)
- struts.xml:action的浏览器访问路径配置文件
- struts.properties:不常用
- web.xml:加载StrutsPrepareAndExecuteFilter的初始化参数值
此加载顺序主要以后面的配置文件内容为主,可以覆盖前面的内容
环境搭建
-
各文件的内容
apps:Struts2提供一些项目案例。(关注点)
docs:Struts2提供的开发规范和文档
lib:Struts2提供的开发jar包
src:Struts2提供的源代码 -
所需jar包
apps/struts2-blank.war/WEB-INF\lib下面的所有jar包
因为struts2-blank.war项目是struts2最基本的环境搭建项目
struts2的使用
- 配置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>
- 编写Action类
public class Struts2Demo01 { //常常继承ActionSupport
//必须是返回字符串的方法
public String execute() {
...
return "success";
}
}
这个ActionSupport类实现类ation,存在5个常量分别为:
SUCCESS:成功"sucess"
NONE:不跳转 null
LOGIN:用于用户登录失败页面跳转 “login”
INPUT:表单出错情况下,页面跳转 “input”
ERROR:错误页面 “error”
- 配置struts2.xml中的Action
<!--
package:配置包
name:包的名称,在配置文件中不要出现重复的包即可
extends:用于继承其他的包,通常继承struts-default
namespace:名称空间,与<action>标签中name一起决定访问路径的
namespace="" 默认名称空间
namespace="/" 根名称空间
namespace="/aa" 带有名称的名称空间
-->
<package name="action" extends="struts-default" namespace="/">
<!--
name:action的名字,和浏览器访问路径有关,与namespace共同决定访问路径
class:Action类的全路径
method:执行Action中的哪个方法,默认值是execute
-->
<action name="hello" class="com.edu.action.Struts2Demo01" method="execute">
<result name="success">/success.jsp</result>
</action>
</package>
-
其他配置
- constant配置:配置struts2中的常量
<!-- 修改访问路径后缀名 --> <constant name="struts.action.extension" value="php"></constant>
- include配置:包含其他的配置文件
<include file="com/edu/struts2_demo01.xml"></include>
action的三种使用方式
- 通过method参数设置:配置过多,冗余。
//前台访问url的路径
<a href="${ pageContext.request.contextPath }/findCustomer.action">查询客户</a>
<a href="${ pageContext.request.contextPath }/saveCustomer.action">保存客户</a>
<a href="${ pageContext.request.contextPath }/updateCustomer.action">修改客户</a>
<a href="${ pageContext.request.contextPath }/deleteCustomer.action">删除客户</a>
//xml配置文件需要书写4个action
<package name="action" extends="struts-default" namespace="/">
<action name="findCustomer" class="com.edu.action.Demo01" method="execute">
<result name="success">...</result>
</action>
<action name="saveCustomer" class="com.edu.action.Demo01" method="execute">
<result name="success">...</result>
</action>
...
</package>
2. 通配符的配置:(前提,访问路径必须与方法名有一定联系)
//页面
<a href="${ pageContext.request.contextPath }/linkMan_find.action">查询联系人</a>
<a href="${ pageContext.request.contextPath }/linkMan_save.action">保存联系人</a>
// * 就代表需要执行的那个方法
<action name="linkMan_*" class="com.edu.action.Demo02" method="{1}"/>
<result name="success">...</result>
</action>
- 动态方法访问方式
//页面,!后面表示要执行的方法
<a href="${ pageContext.request.contextPath }/product!find.action">查询商品</a>
<a href="${ pageContext.request.contextPath }/product!save.action">保存商品</a>
<constant name="struts.enable.DynamicMethodInvocation" value="true"/>
struts2的Servlet的API访问
- 方式一:通过ActionContext实现
ActionContext actionContext = ActionContext.getContext();
Map<String,Object> map = actionContext.getParameters();
- 方式二:实现特定接口的方式实现
public class RequestDemo2Action extends ActionSupport implements ServletRequestAware,ServletContextAware{
private HttpServletRequest request;
private ServletContext application;
}
- 方式三:通过ServletActionContext对象的静态方法实现
HttpServletRequest request = ServletActionContext.getRequest();
Map<String, String[]> parameterMap = request.getParameterMap();
//通过ServletActionContext获取页面数据、往session和Application
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext application = ServletActionContext.getContext();
HttpSession session = request.getSession();
全局结果视图
针对一个包下所有的action都生效的一个页面,先执行局部,再执行全局
//书写在action外,package内
<global-results>
<result>/demo1/success.jsp</result>
</global-results>
配置结果页面
result标签的配置:
//name:逻辑视图的名称,默认是success
//type:
// dispatcher:默认值,转发(转发到jsp页面)
// redirect:重定向(重定向到jsp)
// chain:转发到另一个Action
// redirectAction:重定向到另一个Action
// stream:文件下载
<result name="success" type="dispatcher"></result>
struts2对页面数据的封装
-
常量和String数据的封装
条件:1. 需要有成员属性 2. 需要有set方法
//页面书写
<h2>常量与String数据的封装</h2>
<form method="post" action="${pageContext.request.contextPath}/demo01">
用户名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" >
</form>
-----------------------------------
//action中书写,必须要set方法
private String username;
private int age;
public void setUsername(String username) { //struts会通过set方法,自动封装属性
this.username = username;
}
public void setAge(int age) {
this.age = age;
}
-
对象类型的封装
条件:1. 需要有成员对象 2. 需要set/get方法 3. 页面需要OGNL表达式
//页面书写
<h2>对象的封装</h2>
<form method="post" action="${pageContext.request.contextPath}/demo02">
用户名:<input type="text" name="user.username"><br>
年龄:<input type="text" name="user.age"><br>
<input type="submit" >
</form>
//action书写,必须要有set/get方法
//需要get方法是为了避免出现多个对象,使struts只对一个对象的里的所有属性进行封装
private User user;
public void setUser(User user) {
this.user = user;
}
public User getUser() {
return user;
}
-
模型封装
条件:1. 需要有成员对象,而且还得实例化这个对象 2. 需要实现一个接口 ModelDriver
- 需要提供一个getModel方法 4. 将对象以getModel进行返回
//页面
<form method="post" action="${pageContext.request.contextPath}/demo01">
用户名:<input type="text" name="username"><br>
年龄:<input type="text" name="age"><br>
<input type="submit" >
</form>
//action书写方式
public class demoAction extends ActionSupport implements ModelDriven<User>{
private User user = new User();
@Override
public User getModel() {
return user;
}
}