struts2是什么
概念
struts2使用优势
自动封装参数
参数校验
结果的处理(转发|重定向)
国际化
显示等待页面
表单的防止重复提交
struts2具有更加先进的架构以及思想
struts2的历史
struts2与struts1区别就是技术上没有什么关系.
struts2的前身时webwork框架.
搭建struts2框架
1.导包
<dependencies>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.13</version>
</dependency>
</dependencies>
2.书写Action类
package com.stevezong.struts2;
public class HelloAction {
public String hello() {
System.out.println("hi stevezong");
return "success" ;
}
}
3.书写src/struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="hello" namespace="/hello" extends="struts-default">
<action name="HelloAction" class="com.stevezong.struts2.HelloAction" method="hello">
<result name="success">/hello.jsp</result>
</action>
</package>
<!--
引入其他的struts 配置文件
<include file=""></include>
-->
</struts>
4.将struts2核心过滤器配置到web.xml
<!-- 配置 struts2 核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
5.写 jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello,Stevezong</h1>
</body>
</html>
6.测试
http://127.0.0.1:8080/struts2/hello/HelloAction
struts2访问流程&struts2架构
http://127.0.0.1:8080/struts2/hello/HelloAction
hello/HelloAction->
过滤器 ->
核心配置文件->
hello->
package namespace="hello" ->
HelloAction ->
action name="HelloAction" ->
class="com.stevezong.struts2.HelloAction"->
反射 创建 action 对象->
调用method="hello" hello这个方法->
return "success"->
找 result name="success"的结果->
配置详解
struts.xml配置
<!-- 根元素 -->
<struts>
<!-- package:将action 配置封装,就是可以在package 中配置很多action 同一个业务下的action 配置在一起-->
<!--
http://127.0.0.1:8080/struts2/hello/HelloAction
name属性 给包起个名字 起到标识作用,不能与其他包名重复
namespaces属性 : 给action的访问路径中定义一个前缀 /hello
extends属性 继承一个指定 包 默认就有一个struts-default 包 提供给我们继承 必选的
abstract属性: 包是否为抽象的,标识属性 标识这个包不能独立运行,专门被继承 给开发人员看的 无实际意义
-->
<package name="hello" namespace="/hello" extends="struts-default">
<!--action 元素 配置action 类-->
<!--
name属性 决定了action 访问资源名 /HelloAction
class属性 action 类的完整类名
method属性 指定具体调用action 中的那个方法
-->
<action name="HelloAction" class="com.stevezong.struts2.HelloAction" method="hello">
<!-- result属性 结果配置 -->
<--
name 属性 标识结果处理的名称 与action方法的返回值对应
type 属性 指定调用那个哪一个result类来处理结果 默认使用转发
标签提 填写页面的相对路径
-->
<result name="success" type="dispatcher">/hello.jsp</result>
</action>
</package>
</struts>
struts2常量配置
struts2默认常量配置位置
/org/apache/struts2/default.properties
修改struts2常量配置(方式先后也是加载顺序)
方式1:src/struts.xml ***一般都是在这里配置
<struts>
<package name="hello" namespace="/hello" extends="struts-default">
...
...
...
</package>
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
</struts>
方式2:在src下创建struts.properties
...
struts.i18n.encoding=UTF-8
...
方式3:在项目的web.xml中
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name>struts2</display-name>
<!-- 配置 struts2 核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
</web-app>
顺序
常量配置
<!-- i18n 国际化 解决post 提交乱码 -->
struts.i18n.encoding=UTF-8
<!-- struts 指定访问action时的后缀名
一个是 action
一个是 空
http://127.0.0.1:8080/struts2/hello/HelloAction
http://127.0.0.1:8080/struts2/hello/HelloAction.action
-->
struts.action.extension=action,,
<!-- 指定struts 是否已开发模式运行
1 热加载主配置
2 提供更多错误信息输出
-->
struts.devMode = false
struts2配置的进阶
动态方法调用
方式1
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<!-- 动态方法调用 常亮 控制 默认为false 需要开启 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true"></constant>
<package name="user" namespace="/user" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction" class="com.stevezong.struts2.UserAction">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
package com.stevezong.struts2;
public class UserAction {
public String add() {
System.out.println("addUser");
return "success";
}
public String deleteDemo() {
System.out.println("deleteUser");
return "success";
}
public String updateDemo() {
System.out.println("updateUser");
return "success";
}
public String findDemo() {
System.out.println("findUser");
return "success";
}
}
http://127.0.0.1:8080/struts2/user/UserAction
http://127.0.0.1:8080/struts2/user/UserAction!
http://127.0.0.1:8080/struts2/user/UserAction!updateDemo
http://127.0.0.1:8080/struts2/user/UserAction!add
!方法名
方式2
<struts>
<constant name="struts.devMode" value="true"></constant>
<!-- 动态方法调用 常亮 控制 默认为false 需要开启 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false"></constant>
<package name="user" namespace="/user" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="UserAction_*" class="com.stevezong.struts2.UserAction" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
http://127.0.0.1:8080/struts2/user/UserAction
http://127.0.0.1:8080/struts2/user/UserAction_
http://127.0.0.1:8080/struts2/user/UserAction_updateDemo
http://127.0.0.1:8080/struts2/user/UserAction_add
struts2中的默认配置
<default-action-ref name=""></default-action-ref>
<action method="">
<result name="" type=""></result>
</action>
action method 的默认是 execute
没有写 就去找这个方法
action class 的默认是com.opensymphony.xwork2.ActionSupport
没有写 就用这个class
result name 的默认是 success
没有写 就去找这个
result type 的默认是 dispatcher
没有写,就是用转发
default-action-ref name="defaultAction"
如果找不到包下的action, 会使用一个defaultAction 作为默认action
action类详解
Action类的书写方式
方式1 少用
创建一个类 可以是POJO 不用继承任何父类 也不需要实现任何接口
public class Demo{
public String add(){
}
}
方式2
实现一个接口 Action 接口预制了一写字符串
package com.stevezong.struts2;
import com.opensymphony.xwork2.Action;
public class DemoAction implements Action{
//没什么作用,放着就可以就是提供一个规范
public String execute() throws Exception {
return null;
}
}
方式3 常用
继承一个类 ActionSupport
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class DemoAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
}
结果跳转方式
转发
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="da" namespace="/da" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<!--转发-->
<action name="Demo2Action_*" class="com.stevezong.struts2.Demo2Action" method="{1}">
<result name="success">/hello.jsp</result>
</action>
</package>
</struts>
重定向
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="da" namespace="/da" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<!--重定向-->
<action name="Demo3Action_*" class="com.stevezong.struts2.Demo3Action" method="{1}">
<result name="success" type="redirect">/hello.jsp</result>
</action>
</package>
</struts>
转发到Action
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="da" namespace="/da" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="Demo2Action_*" class="com.stevezong.struts2.Demo2Action" method="{1}">
<result name="success">/hello.jsp</result>
</action>
<action name="Demo3Action_*" class="com.stevezong.struts2.Demo3Action" method="{1}">
<result name="success" type="redirect">/hello.jsp</result>
<!-- 转发到action-->
</action>
<action name="Demo4Action_*" class="com.stevezong.struts2.Demo4Action" method="{1}">
<result name="success" type="chain">
<param name="actionName">Demo3Action</param>
<param name="namespace">/da</param>
</result>
</action>
</package>
</struts>
重定向到Action
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="da" namespace="/da" extends="struts-default">
<!-- 2.5版本以后 必须 配合动态方法调用-->
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="Demo2Action_*" class="com.stevezong.struts2.Demo2Action" method="{1}">
<result name="success">/hello.jsp</result>
</action>
<action name="Demo3Action_*" class="com.stevezong.struts2.Demo3Action" method="{1}">
<result name="success" type="redirect">/hello.jsp</result>
</action>
<action name="Demo4Action_*" class="com.stevezong.struts2.Demo4Action" method="{1}">
<result name="success" type="chain">
<param name="actionName">Demo3Action</param>
<param name="namespace">/da</param>
</result>
</action>
<!-- 重定向到Action -->
<action name="Demo5Action_*" class="com.stevezong.struts2.Demo5Action" method="{1}">
<result name="success" type="redirectAction">
<param name="actionName">Demo4Action</param>
<param name="namespace">/da</param>
</result>
</action>
</package>
</struts>
访问servletAPI方式
原理
通过ActionContext *****
Java:
package com.stevezong.struts2;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Demo6Action extends ActionSupport{
@Override
public String execute() throws Exception {
//session 域
Map<String, Object> session = ActionContext.getContext().getSession();
session.put("name", "session");
Map<String, Object> application = ActionContext.getContext().getApplication();
application.put("name", "application");
//=====================================================================================
//不推荐使用原生的request域
String key = "request";
Map<String, Object> requestScoper = (Map<String, Object>) ActionContext.getContext().get(key);
// 推荐
ActionContext.getContext().put("name", "request");
//=====================================================================================
System.out.println("execute5");
return super.execute();
}
}
JSP:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
request:${ requestScope.name }
session:${sessionScope.name }
application: ${applicationScope.name }
</body>
</html>
XML:
<package name="api" namespace="/api" extends="struts-default">
<action name="Demo6Action" class="com.stevezong.struts2.Demo6Action">
<result name="success">/api.jsp</result>
</action>
</package>
通过ServletActionContext
package com.stevezong.struts2;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Demo7Action extends ActionSupport {
@Override
public String execute() throws Exception {
// 不推荐
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
ServletContext servletContext = ServletActionContext.getServletContext();
HttpSession session = request.getSession();
System.out.println("execute7");
return super.execute();
}
}
通过实现接口方式
package com.stevezong.struts2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import com.opensymphony.xwork2.ActionSupport;
public class Demo8Action extends ActionSupport implements ServletRequestAware, ServletResponseAware {
// 实现不同的XXXXAware接口 重写 setxxx方法
private HttpServletRequest request;
private HttpServletResponse response;
@Override
public String execute() throws Exception {
System.out.println("execute8");
return super.execute();
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}
如何获得参数
1、第一种
1、jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="name" type="text">
<input type="submit">
</form>
</body>
</html>
2、java
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Demo9Action extends ActionSupport {
private String name;
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println("name参数的值" + name);
System.out.println("execute9");
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3、xml
<package name="api" namespace="/api" extends="struts-default">
<action name="Demo6Action" class="com.stevezong.struts2.Demo6Action">
<result name="success">/api.jsp</result>
</action>
<action name="Demo9Action" class="com.stevezong.struts2.Demo9Action">
<result name="success">/form.jsp</result>
</action>
</package>
扩展
strutsMVC
Action生命周期
1.每次请求到来时,都会创建一个新的Action实例
2.Action是线程安全的.可以使用成员变量接收参数
属性驱动获得参数
1、给action 添加一个属性
1、java
package com.stevezong.struts2;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
public class Demo9Action extends ActionSupport {
private String name;
//自动类型装换,8大基本类型和包装类
private Integer age;
//支持特定的类型字符串转换为Date yyyy-MM-dd
private Date br;
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println("name参数的值" + name);
System.out.println("age参数"+age);
System.out.println("br的参数"+br);
return "success";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBr() {
return br;
}
public void setBr(Date br) {
this.br = br;
}
}
2、jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="name" type="text">
<input name="age" type="text">
<input name="br" type="text">
<input type="submit">
</form>
</body>
</html>
对象驱动(jsp中注意)
1创建一个User 类
2、Action中 private User user;
3、修改jsp中 name 的值为 user.xxx
1、java
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionSupport;
import com.stevezong.struts2.domain.User;
public class Demo9Action extends ActionSupport {
private User user;
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println(user);
return "success";
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
2、java
package com.stevezong.struts2.domain;
import java.util.Date;
public class User {
private String name;
private Integer age;
private Date br;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBr() {
return br;
}
public void setBr(Date br) {
this.br = br;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", br=" + br + "]";
}
}
3、jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="user.name" type="text">
<input name="user.age" type="text">
<input name="user.br" type="text">
<input type="submit">
</form>
</body>
</html>
模型驱动
1实现一个ModelDriven 接口 有一个泛型就是你要接受的类
2、private User user = new User();
3、实现 接口的方法 格式固定
public User getModel() {
return user;
}
1、
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.stevezong.struts2.domain.User;
public class Demo9Action extends ActionSupport implements ModelDriven<User> {
private User user = new User();
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println(user);
return "success";
}
public User getModel() {
return user;
}
}
2、
package com.stevezong.struts2.domain;
import java.util.Date;
public class User {
private String name;
private Integer age;
private Date br;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Date getBr() {
return br;
}
public void setBr(Date br) {
this.br = br;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", br=" + br + "]";
}
}
3、jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="name" type="text">
<input name="age" type="text">
<input name="br" type="text">
<input type="submit">
</form>
</body>
</html>
集合类型参数封装
list
1、java
package com.stevezong.struts2;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class Demo9Action extends ActionSupport {
private List<String> list;
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println(list);
return "success";
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
}
2、jsp list 可以指定下标
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="list" type="text">
<input name="list[2]" type="text">
<input name="list[1]" type="text">
<input type="submit">
</form>
</body>
</html>
map
1、java
package com.stevezong.struts2;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
public class Demo9Action extends ActionSupport {
private Map<String,String> map;
@Override
public String execute() throws Exception {
// 如何获得参数
System.out.println(map);
return "success";
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
2、jsp 结果:{br=3, name=1, age=2}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${pageContext.request.contextPath}/api/Demo9Action">
<input name="map['name']" type="text">
<input name="map['age']" type="text">
<input name="map['br']" type="text">
<input type="submit">
</form>
</body>
</html>
OGNL表达式
OGNL:对象视图导航语言. ${user.addr.name} 这种写法就叫对象视图导航.
OGNL不仅仅可以视图导航.支持比EL表达式更加丰富的功能.
使用OGNL准备工作
导包
struts2 的包中已经包含了.所以不需要导入额外的jar包
代码准备
OGNL 表达式
OGNLContext Ognl上下文对象
ROOT Context
放任何对象那个未做root 都可以
Map
语法
基本取值
赋值
调用方法
调用静态方法
创建对象(List,Map)
package com.stevezong.struts2;
import java.util.HashMap;
import java.util.Map;
import org.junit.Test;
import com.stevezong.struts2.domain.User2;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
public class Demo1 {
@Test
public void fun1() throws Exception {
// 准备 ROOT
User2 user = new User2("stevezong", 18);
// 准备Context
Map<String, User2> context = new HashMap<String, User2>();
context.put("user1", new User2("steve", 17));
context.put("user2", new User2("zong", 18));
// 准备OGNLContext
OgnlContext oc = new OgnlContext();
oc.setRoot(user);
oc.setValues(context);
// 书写OGNL
//取出root中的user对象的name属性和age属性
String name = (String) Ognl.getValue("name", oc,oc.getRoot());
Integer age = (Integer) Ognl.getValue("age", oc,oc.getRoot());
System.out.println(name+":"+age);
// 书写OGNL
//取出Context中的 #从context中取 user1 获取那个 .name 获取那个属性
String name1 = (String) Ognl.getValue("#user1.name", oc,oc.getRoot());
Integer age1 = (Integer) Ognl.getValue("#user1.age", oc,oc.getRoot());
System.out.println(name1+":"+age1);
// 书写OGNL
//root 赋值
Ognl.getValue("name='zongsteve'", oc,oc.getRoot());
String name2 = (String) Ognl.getValue("name", oc,oc.getRoot());
System.out.println("name2:"+name2);
// 书写OGNL
//Context 赋值
Ognl.getValue("#user1.name='zong'", oc,oc.getRoot());
String name3 = (String) Ognl.getValue("#user1.name", oc,oc.getRoot());
System.out.println("name3:"+name3);
// 书写OGNL
//调用Root的get set方法
Ognl.getValue("setName('steve')", oc,oc.getRoot());
String name4 = (String) Ognl.getValue("getName()", oc,oc.getRoot());
System.out.println("name4:"+name4);
// 书写OGNL
//调用Context的get set方法
Ognl.getValue("#user1.setName('steve')", oc,oc.getRoot());
String name5 = (String) Ognl.getValue("#user1.getName()", oc,oc.getRoot());
System.out.println("name5:"+name5);
// 书写OGNL
//调用静态方法@加类的全限定名@方法名(参数)
String str = (String) Ognl.getValue("@com.stevezong.struts2.TestUtil@echo('hi stevezong')", oc,oc.getRoot());
System.out.println("str:"+str);
// 书写OGNL
//创建list对象
Integer size = (Integer) Ognl.getValue("{'stevezong','steve','zong'}.size()", oc,oc.getRoot());
//获取list中的对象
String name6 = (String) Ognl.getValue("{'stevezong','steve','zong'}[0]", oc,oc.getRoot());
//获取list中的对象
String name7 = (String) Ognl.getValue("{'stevezong','steve','zong'}.get(1)", oc,oc.getRoot());
System.out.println("size:"+size);
System.out.println("name6:"+name6);
System.out.println("name7:"+name7);
// 书写OGNL
//创建map对象
Integer size2 = (Integer) Ognl.getValue("#{'name':'stevezong','age':'18'}.size()", oc,oc.getRoot());
String name8 = (String)Ognl.getValue("#{'name':'stevezong','age':'18'}['name']", oc,oc.getRoot());
Integer age2 = (Integer)Ognl.getValue("#{'name':'stevezong','age':18}.get('age')", oc,oc.getRoot());
System.out.println("size2:"+size2);
System.out.println("name8:"+name8);
System.out.println("age2:"+age2);
}
}
package com.stevezong.struts2.domain;
public class User2 {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User2 [name=" + name + ", age=" + age + "]";
}
public User2() {
super();
}
public User2(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
}
OGNL与Struts2的结合
结合原理
Ognl 表达式要想运行 要有 OGNLContext Struts2 就提供了一个OGNLContext 不过名字换成了 ValueStack
ValueStack中的两部分
Root 放了一个栈
Context 放的是ActionContext(数据中心)
栈原理
栈是由ArrayList模拟的
栈中的两个方法的实现
访问栈中属性的特点.由上到下
查看值栈中两部分内容(使用DEBUG标签)
Root
默认情况下,栈中放置当前访问的Action对象
Context
Context部分就是ActionContext数据中心
struts2与ognl结合体现
参数接收
如何获得值栈对象,值栈对象与ActionContext对象是互相引用的
配置文件中
语法:${ognl表达式}
${name}
就会从 当前的Action对象的中查找 name这个属性
struts2标签
扩展:request对象的getAttribute方法
查找顺序
自定义拦截器
架构
拦截器创建
创建方式1 实现一个 接口 Interceptor
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;
public class MyInterceptor implements Interceptor{
//拦截器的生命周期 随项目的启动而创建 随项目的关闭而销毁
//销毁方法
public void destroy() {
}
//初始化方法
public void init() {
}
//拦截方法
public String intercept(ActionInvocation invocation) throws Exception {
return null;
}
}
创建方式2 继承一个 类AbstractInterceptor 帮助我们写好了 init方法 和 destroy方法
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class MyInterceptor2 extends AbstractInterceptor{
@Override
public String intercept(ActionInvocation invocation) throws Exception {
return null;
}
}
创建方式3
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor{
//功能 定制拦截器拦截的方法
//定制哪些方法需要拦截
//定制哪些方法不需要拦截
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
return null;
}
}
拦截器api
放行
前后处理
不放行,直接跳转到一个结果页面
不执行后续的拦截器以及Action,直接交给Result处理结果.进行页面跳转
拦截器配置
步骤1:注册拦截器
步骤2:配置拦截器栈
步骤3:指定包中默认拦截器栈
如何定制拦截方法
全局结果集
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<constant name="struts.devMode" value="true"></constant>
<package name="vs" namespace="/vs" extends="struts-default">
<!-- 1 指定默认拦截器-->
<interceptors>
<!-- 1 注册拦截器 -->
<interceptor name="myInter" class="com.stevezong.struts2.MyInterceptor3"></interceptor>
<!-- 2 注册拦截器栈 -->
<interceptor-stack name="myStack1">
<!--2.1 自定义拦截器引入 -->
<interceptor-ref name="myInter">
<!-- 二选一 不可以同时指定 -->
<!-- 指定哪些方法不拦截 -->
<!-- <param name="excludeMethods">add,del</param> -->
<!-- 指定哪些方法拦截 -->
<param name="includeMethods">add,del</param>
</interceptor-ref>
<!--2.2 引用默认的拦截器栈(20个) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
</interceptor-stack>
</interceptors>
<!-- 3指定 默认拦截器栈 -->
<default-interceptor-ref name="myStack1"></default-interceptor-ref>
<global-allowed-methods>regex:.*</global-allowed-methods>
<action name="Demo3_*" class="com.stevezong.struts2.Demo3" method="{1}">
<!-- 为Action 单独指定走哪个拦截器(栈) -->
<!-- <interceptor-ref name=""></interceptor-ref> -->
<result name="success">/vs.jsp</result>
</action>
</package>
</struts>
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
public class MyInterceptor3 extends MethodFilterInterceptor{
//功能 定制拦截器拦截的方法
//定制哪些方法需要拦截
//定制哪些方法不需要拦截
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
//前处理
System.out.println("1");
//放行
invocation.invoke();
System.out.println("2");
//后处理
return "success";
}
}
package com.stevezong.struts2;
import com.opensymphony.xwork2.ActionSupport;
public class Demo3 extends ActionSupport{
@Override
public String execute() throws Exception {
System.out.println("execute");
return "success";
}
public String add() throws Exception {
System.out.println("Demo3add");
return "success";
}
public String del() throws Exception {
System.out.println("Demo3del");
return "success";
}
public String update() throws Exception {
System.out.println("Demo3update");
return "success";
}
public String find() throws Exception {
System.out.println("Demo3find");
return "success";
}
}
struts2标签(了解)
标签体系'
struts2标签结构
控制标签
数据标签
表单标签
非表单标签
在action中添加错误信息
取出错误信息
异常 配置
<package name="user" namespace="/user" extends="struts-default">
<global-allowed-methods>regex:.*</global-allowed-methods>
<global-exception-mappings><!-- 全局异常 配置 -->
<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>
</global-exception-mappings>
<action name="UserAction_*" class="com.stevezong.crm.web.action.UserAction" method="{1}">
<result name="toIndex" type="redirect">/index.htm</result>
<result name="error">/jsp/error.jsp</result>
</action>
</package>