1、结果跳转方式
配置文件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>
<!--常量配置方式二 -->
<!--i18n:国际化,解决post提交乱码-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定访问action时的后缀名为.do或空
http://localhost:8080/struts2_1/hello/HelloAction.do
-->
<constant name="struts.action.extension" value="do,,"></constant>
<!-- 指定struts2是否以开发模式运行
1、热加载主配置文件(不需要重启即可生效)
2、提供更多错误信息输出,方便开发时调试
-->
<constant name="struts.devMode" value="false"></constant>
<!-- package:将Action配置封装,就是可以在Package中配置很多action
name属性:给包起个名字,起到标识作用,随便起,不能与其他包名重复
namespace属性:给action的访问路径中定义一个命名空间
extends属性:继承一个指定包
abstract属性:包是否为抽象的,标识属性,标识该包不能独立运行,专门呢被继承
-->
<package name="result" namespace="/" extends="struts-default">
<!-- action元素:配置action类
name属性:决定了Action访问资源名
class属性:action的完整类名
method属性:指定调用Action中的哪个方法来处理请求
-->
<!-- 转发 -->
<action name="Demo1Action" class="cn.ctgu.result.Demo1Action" method="execute">
<result name="success" type="dispatcher">/hello.jsp</result>
</action>
<!-- 重定向 -->
<action name="Demo2Action" class="cn.ctgu.result.Demo2Action" method="execute">
<result name="success" type="redirect">/hello.jsp</result>
</action>
<!--转发到action,地址栏不会变化 -->
<action name="Demo3Action" class="cn.ctgu.result.Demo3Action" method="execute">
<result name="success" type="chain">
<!--action的名字 -->
<param name="actionName">Demo1Action</param>
<!--action所在的命名空间 -->
<param name="namespace">/</param>
</result>
</action>
<!--重定向到action -->
<action name="Demo4Action" class="cn.ctgu.result.Demo4Action" method="execute">
<result name="success" type="redirectAction">
<!--action的名字 -->
<param name="actionName">Demo1Action</param>
<!--action所在的命名空间 -->
<param name="namespace">/</param>
</result>
</action>
</package>
<!-- 引入其他struts配置文件 -->
<include file="cn/ctgu/api/struts.xml"></include>
<include file="cn/ctgu/param/struts.xml"></include>
</struts>
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" id="WebApp_ID" version="2.5">
<display-name>Struts2_2</display-name>
<!-- 配置常量方法三 -->
<!-- <context-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>utf-8</param-value>
</context-param> -->
<!-- struts2核心过滤器 -->
<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>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
Demo1Action.java(转发)
package cn.ctgu.result;
import com.opensymphony.xwork2.ActionSupport;
public class Demo1Action extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("Demo1Action start");
return SUCCESS;
}
}
Demo2Action.java(重定向)
package cn.ctgu.result;
import com.opensymphony.xwork2.ActionSupport;
public class Demo2Action extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return SUCCESS;
}
}
Demo3Action.java(转发到action)
package cn.ctgu.result;
import com.opensymphony.xwork2.ActionSupport;
public class Demo3Action extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("Demo3Action start");
return SUCCESS;
}
}
Demo4Action.java(重定向到action)
package cn.ctgu.result;
import com.opensymphony.xwork2.ActionSupport;
public class Demo4Action extends ActionSupport{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("Demo4Action start");
return SUCCESS;
}
}
2、Struts2访问Servlet的API
配置文件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>
<package name="api" namespace="/" extends="struts-default">
<!-- action元素:配置action类
name属性:决定了Action访问资源名
class属性:action的完整类名
method属性:指定调用Action中的哪个方法来处理请求
-->
<!-- 转发 -->
<action name="Demo5Action" class="cn.ctgu.api.Demo5Action" method="execute">
<result name="success" type="dispatcher">/api.jsp</result>
</action>
</package>
</struts>
Demo5Action.java(访问Servlet方式一)
package cn.ctgu.api;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class Demo5Action extends ActionSupport{
@Override
public String execute() throws Exception {
//request域=>map(Struts2并不推荐使用原生request域)
//不推荐
/*Map<String,Object>requestScope=(Map<String,Object>)ActionContext.getContext().get("request");
requestScope.put("name", "requestTom");*/
//推荐
ActionContext.getContext().put("name", "requestTom");
// session域=》map
Map<String,Object>sessionScope=ActionContext.getContext().getSession();
sessionScope.put("name", "sessionTom");
//application域=》map
Map<String,Object>applicationScope=ActionContext.getContext().getApplication();
applicationScope.put("name", "applicationTom");
return SUCCESS;
}
}
Demo6Action.java(访问Servlet方式二)
package cn.ctgu.api;
import java.util.Map;
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.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
//如何在action中获得原生ServletAPI,不推荐
public class Demo6Action extends ActionSupport{
@Override
public String execute() throws Exception {
//原生request
HttpServletRequest request=ServletActionContext.getRequest();
//原生session
HttpSession session=request.getSession();
//原生response
HttpServletResponse response=ServletActionContext.getResponse();
//原生servletContext
ServletContext servletContext=ServletActionContext.getServletContext();
return SUCCESS;
}
}
Demo7Action.java(获得Servlet方式三)
package cn.ctgu.api;
import java.util.Map;
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 org.apache.struts2.interceptor.ServletRequestAware;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
//如何在action中获得原生ServletAPI
//获得request就实现ServletRequestAware接口,获得response就实现ServletResponseAware,.....
public class Demo7Action extends ActionSupport implements ServletRequestAware{
private HttpServletRequest request;
@Override
public String execute() throws Exception {
//
System.out.println("原生request:"+request);
return SUCCESS;
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
}
}
api.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 }<br/>
session:${sessionScope.name }<br/>
application:${applicationScope.name }<br/>
</body>
</html>
3、获得参数
配置文件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>
<package name="param" namespace="/" extends="struts-default">
<!-- action元素:配置action类
name属性:决定了Action访问资源名
class属性:action的完整类名
method属性:指定调用Action中的哪个方法来处理请求
-->
<!-- 转发 -->
<action name="Demo8Action" class="cn.ctgu.param.Demo8Action" method="execute">
<result name="success" type="dispatcher">/form1.jsp</result>
</action>
<action name="Demo9Action" class="cn.ctgu.param.Demo9Action" method="execute">
<result name="success" type="dispatcher">/form2.jsp</result>
</action>
<action name="Demo10Action" class="cn.ctgu.param.Demo10Action" method="execute">
<result name="success" type="dispatcher">/form3.jsp</result>
</action>
<action name="Demo11Action" class="cn.ctgu.param.Demo11Action" method="execute">
<result name="success" type="dispatcher">/form4.jsp</result>
</action>
</package>
</struts>
Demo8Action.java(获得参数方式一)
package cn.ctgu.param;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
//Struts如何获得参数
public class Demo8Action extends ActionSupport{
//第一种方式:只需要准备与参数键名相同的属性即可
public Demo8Action() {
super();
System.out.println("demo8Action 创建了");//Action是线程安全的,每次访问都会创建一个新的实例
}
private String name;
//自动类型转换 只能转换8大基本数据类型以及对应包装类
private Integer age;
//支持特定类型字符串转换为Date,例如yyyy-MM-dd
private Date birthday;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("name参数值:"+name+",age参数值是:"+age+",生日:"+birthday);
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 getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
}
form1.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 }/Demo8Action">
用户名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
Demo9Action.java(获得参数方式二)
User.java
package cn.ctgu.domain;
import java.util.Date;
public class User {
private String name;
private Integer age;
private Date birthday;
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 getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + ", birthday=" + birthday + "]";
}
}
package cn.ctgu.param;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
import cn.ctgu.domain.User;
//Struts如何获得参数
public class Demo9Action extends ActionSupport{
//第二种方式:准备对象
//准备User对象
private User user;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return SUCCESS;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
form2.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 }/Demo9Action">
用户名:<input type="text" name="user.name"/><br/>
年龄:<input type="text" name="user.age"/><br/>
生日:<input type="text" name="user.birthday"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
Demo10Action.java(获得参数方式三)
package cn.ctgu.param;
import java.util.Date;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.ctgu.domain.User;
//Struts如何获得参数
public class Demo10Action extends ActionSupport implements ModelDriven<User>{
//第三种方式:模型驱动
//准备User对象
private User user=new User();
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(user);
return SUCCESS;
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
}
form3.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 }/Demo10Action">
用户名:<input type="text" name="name"/><br/>
年龄:<input type="text" name="age"/><br/>
生日:<input type="text" name="birthday"/><br/>
<input type="submit" value="提交"/>
</form>
</body>
</html>
4、集合类型参数封装
Demo11Action.java
package cn.ctgu.param;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import cn.ctgu.domain.User;
//Struts2封装集合类型参数
public class Demo11Action extends ActionSupport{
//list
private List<String>list;
//map
private Map<String,String>map;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("list:"+list);
System.out.println("map:"+map);
return SUCCESS;
}
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
}
form4.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 }/Demo11Action" method="post">
list:<input type="text" name="list"/><br/>
list:<input type="text" name="list[3]"/><br/><!-- 指定存储在集合的位置 -->
map:<input type="text" name="map['haha']"/><br/><!--将haha作为关键字,填写的内容作为值 -->
<input type="submit" value="提交"/>
</form>
</body>
</html>
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>
<!--常量配置方式二 -->
<!--i18n:国际化,解决post提交乱码-->
<constant name="struts.i18n.encoding" value="UTF-8"></constant>
<!-- 指定访问action时的后缀名为.do或空
http://localhost:8080/struts2_1/hello/HelloAction.do
-->
<constant name="struts.action.extension" value="do,,"></constant>
<!-- 指定struts2是否以开发模式运行
1、热加载主配置文件(不需要重启即可生效)
2、提供更多错误信息输出,方便开发时调试
-->
<constant name="struts.devMode" value="false"></constant>
<!-- package:将Action配置封装,就是可以在Package中配置很多action
name属性:给包起个名字,起到标识作用,随便起,不能与其他包名重复
namespace属性:给action的访问路径中定义一个命名空间
extends属性:继承一个指定包
abstract属性:包是否为抽象的,标识属性,标识该包不能独立运行,专门呢被继承
-->
<package name="result" namespace="/" extends="struts-default">
<!-- action元素:配置action类
name属性:决定了Action访问资源名
class属性:action的完整类名
method属性:指定调用Action中的哪个方法来处理请求
-->
<!-- 转发 -->
<action name="Demo1Action" class="cn.ctgu.result.Demo1Action" method="execute">
<result name="success" type="dispatcher">/hello.jsp</result>
</action>
<!-- 重定向 -->
<action name="Demo2Action" class="cn.ctgu.result.Demo2Action" method="execute">
<result name="success" type="redirect">/hello.jsp</result>
</action>
<!--转发到action,地址栏不会变化 -->
<action name="Demo3Action" class="cn.ctgu.result.Demo3Action" method="execute">
<result name="success" type="chain">
<!--action的名字 -->
<param name="actionName">Demo1Action</param>
<!--action所在的命名空间 -->
<param name="namespace">/</param>
</result>
</action>
<!--重定向到action -->
<action name="Demo4Action" class="cn.ctgu.result.Demo4Action" method="execute">
<result name="success" type="redirectAction">
<!--action的名字 -->
<param name="actionName">Demo1Action</param>
<!--action所在的命名空间 -->
<param name="namespace">/</param>
</result>
</action>
</package>
<!-- 引入其他struts配置文件 -->
<include file="cn/ctgu/api/struts.xml"></include>
<include file="cn/ctgu/param/struts.xml"></include>
</struts>