Java 49:struts2

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("@[email protected]('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>

原文地址:http://blog.51cto.com/lmdtx/2147096

时间: 2024-10-09 18:11:03

Java 49:struts2的相关文章

[原创]java WEB学习笔记6:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记61:Struts2学习之路--通用标签 property,uri,param,set,push,if-else,itertor,sort,date,a标签等

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

[原创]java WEB学习笔记70:Struts2 学习之路-- 输入验证,声明式验证,声明是验证原理

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

《Java从入门到放弃》入门篇:Struts2的基本访问方式

Struts2是个什么玩意呢? 引用百度百科的介绍:Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互. 介绍完毕··· 其核心原理图网上很多,我这儿做了一个简单的修改,如果有说明得不够恰当的地方,请指正.原理图请Look: 好了,到这儿差不多闲扯完了,来聊点有用的.Struts2到底怎么用呢,看下面的步骤 1.新建Web项目(好像是废话) 2.导入Struts2

java中结合struts2自定义标签的使用

java中结合struts2自定义标签的使用 一.建立一个继承于SimpleTagSupport类实现它的doTag方法 1 package com.xiangshang.tag; 2 3 import java.io.IOException; 4 import java.util.List; 5 6 import javax.servlet.jsp.JspException; 7 import javax.servlet.jsp.PageContext; 8 import javax.serv

Java NIO6:选择器2---代码篇

选择器服务器端代码 上一篇文章毫无条理地讲了很多和选择器相关的知识点,下面进入实战,看一下如何写和使用选择器实现服务端Socket数据接收的程序,这也是NIO中最核心.最精华的部分. 看一下代码: 1 public class SelectorServer 2 { 3 private static int PORT = 1234; 4 5 public static void main(String[] args) throws Exception 6 { 7 // 先确定端口号 8 int p

Java线程:锁

一.锁的原理 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行的代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁定对象.在对象上锁定或在对象上同步. 当程序运行到synchronized同步方法或代码块时该对象锁才起作用.一个对象只有一个锁.所以一个线程获得该所,就没有其他线程获得,直到第一个线程释放(或返回)锁.这也意味着任何其他线程都不能进入该对象上的synchronized方法或代码块,直到该锁被释放.

Java线程:线程状态的转换

Java线程:线程状态的转换 一.线程状态 线程的状态转换是线程控制的基础.线程状态总的可分为五大状态:分别是生.死.可运行.运行.等待/阻塞.用一个图来描述如下: 1.新状态:线程对象已经创建,还没有在其上调用start()方法. 2.可运行状态:当线程有资格运行,但调度程序还没有把它选定为运行线程时线程所处的状态.当start()方法调用时,线程首先进入可运行状态.在线程运行之后或者从阻塞.等待或睡眠状态回来后,也返回到可运行状态. 3.运行状态:线程调度程序从可运行池中选择一个线程作为当前