前面我们讲到了,Struts2框架的配置和基本使用方法,接下来一起继续学习吧。
1、协同开发与3种Action实现方式
协同开发
目录结构
HelloAction.java
package com.test.hello;
import com.opensymphony.xwork2.ActionSupport;
public class HelloAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("hello页面");
return "hello";
}
}
struts_hello.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="demo1" namespace="/H" extends="struts-default">
<action name="hel" class="com.test.hello.HelloAction">
<result name="hello">
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/H/hel.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
PaymentAction.java
package com.test.pay;
public class PaymentAction {
public String execute(){
// TODO Auto-generated method stub
System.out.println("pay页面");
return "pay";
}
}
struts_pay.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="demo2" namespace="/P" extends="struts-default">
<action name="pa" class="com.test.pay.PaymentAction">
<result name="pay">
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/P/pa.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
LoginAction.java
package com.test.user;
import com.opensymphony.xwork2.Action;
public class LoginAction implements Action{
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println("login页面");
return "login";
}
}
struts_login.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="demo3" namespace="/L" extends="struts-default">
<action name="log" class="com.test.user.LoginAction">
<result name="login">
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/L/log.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
开发者共同开发,各自调度资源,由struts.xm
l统一管理 (include功能)
<?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>
<!-- constant元素用于常量的配置,可用于编辑struts.properties的常量 -->
<!-- 设置默认编码集为UTF-8 -->
<constant name="struts.i18n.enconding" value="UTF-8" />
<!-- 关闭动态方法调用功能 -->
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<!-- localhost:8080/txkt/test_login.action -->
<!-- localhost:8080/txkt/test_register.action -->
<!-- include用于包含配置 -->
<include file="com/test/hello/struts_hello.xml"></include>
<include file="com/test/pay/struts_pay.xml"></include>
<include file="com/test/user/struts_login.xml"></include>
<include file="example.xml" />
<!-- Add packages here -->
</struts>
新建index.jsp空白页面
启动tomcat服务器
浏览器分别输入:
localhost:8080/txkt/H/hel.action
localhost:8080/txkt/P/pa.action
localhost:8080/txkt/L/log.action
查看控制台
3种实现方式
附:具体实现方法看xml文件action的method属性,默认为execute()方法
(1)继承ActionSupport和execute()方法
(2)实现Action接口
(3)自己定义实现方法
2、动态调用方法
参考链接,点击进入
3、Action访问ServletAPI
方法1
实现ServletRequestAware,ServletResponseAware,SessionAware等感知接口
ApiAction.java
package com.test.api;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import com.opensymphony.xwork2.ActionSupport;
public class ApiAction extends ActionSupport implements ServletRequestAware,ServletResponseAware,SessionAware{
private static final long serialVersionUID = 1L;
private HttpServletRequest request;
private HttpServletResponse response;
private Map<String, Object> session;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
// request
String sid=request.getParameter("sid");
System.out.println(sid);
//response
response.getWriter().print("sid:"+sid);
//session
HttpSession session1 = request.getSession();
session1.setAttribute("sname", "lisi");
String s1=session1.getAttribute("sname").toString();
System.out.println(s1);
session.put("sex", "male");
System.out.println(Arrays.asList(session.get("sex")));
return "ok";
}
@Override
public void setServletRequest(HttpServletRequest request) {
// TODO Auto-generated method stub
this.request=request;
}
@Override
public void setServletResponse(HttpServletResponse response) {
// TODO Auto-generated method stub
this.response=response;
}
@Override
public void setSession(Map<String, Object> session) {
// TODO Auto-generated method stub
this.session=session;
}
}
配置xml
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="apikg" namespace="/Api" extends="struts-default">
<action name="api" class="com.test.api.ApiAction">
<result name="ok"><!-- 默认是转发 -->
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/Api/api.action -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
浏览器输入http://localhost:8080/txkt/Api/api.action?sid=001
启动服务器
方法2
通过ServletActionContext工具类获取
ApiAction2.java
package com.test.api;
import java.util.Arrays;
import java.util.Map;
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 ApiAction2 extends ActionSupport {
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
HttpServletRequest request= ServletActionContext.getRequest();
HttpServletResponse response= ServletActionContext.getResponse();
// request
String sid=request.getParameter("sid");
System.out.println(sid);
//response
response.getWriter().print("sid:"+sid);
//session
HttpSession session1 = request.getSession();
session1.setAttribute("sname", "lisi");
String s1=session1.getAttribute("sname").toString();
System.out.println(s1);
return "ok";
}
}
<action name="api2" class="com.test.api.ApiAction2">
<result name="ok"><!-- 默认是转发 -->
/index.jsp
</result>
</action>
浏览器输入http://localhost:8080/txkt/Api/api2.action?sid=001
启动服务器
方式3(少用)
通过ActionContext工具类获取
参考博客:点击进入
【获取Map类型的request/session/application属性】
通过ActionContext获取
public class HelloWorldAction {
public String execute() {
ActionContext ctx = ActionContext.getContext();
Map<String, Object> application = ctx.getApplication();
Map<String, Object> session = ctx.getSession();
Map<String, Object> request = ctx.get("request");
application.put("application","应用范围");
session.put("session","session范围");
request.put("request","request范围");
return "message";
}
}
在JSP页面就可以通过EL表达式获取相应作用域中的属性
${applicationScope.application}
${sessionScope.session}
${requestScope.request}
或通过
<s:property value="#application.application" />
<s:property value="#session.session" />
<s:property value="#request.request" />
4、Action的3种接受方式
方式一
将属性直接写在action中,就能直接取到值,action自动完成,需要提供set方法。
ParamAction.java
package com.test.param;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer sid;
private String sname;
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(sid+":"+sname);
return "ok";
}
}
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="par" namespace="/P" extends="struts-default">
<action name="param" class="com.test.param.ParamAction">
<result name="ok">
/index.jsp
</result>
</action>
</package>
<!-- localhost:8080/txkt/P/param.action?sid=001&sname="zhangsan" -->
<!-- include用于包含配置 -->
<include file="example.xml" />
<!-- Add packages here -->
</struts>
浏览器访问地址:
http://localhost:8080/txkt/P/param.action?sid=001&sname=“zhangsan”
控制台上输出:
方式二
通过Model层思想,也就是JavaBean或者说是Domain,
属性·需要指明set,get方法。
User类(属性封装类)
package com.test.param;
public class User {
private Integer sid;
private String sname;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "学号:"+sid+" 姓名:"+sname+" 年龄:"+age;
}
}
ParamAction2.java
package com.test.param;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction2 extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 1L;
// 对象1
private User u;
public void setU(User u) {
this.u = u;
}
public User getU() {
return u;
}
// 对象2
private User u2;
public void setU2(User u2) {
this.u2 = u2;
}
public User getU2() {
return u2;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(u);
System.out.println(u2);
return "ok";
}
}
<action name="param2" class="com.test.param.ParamAction2">
<result name="ok">
/index.jsp
</result>
</action>
可用于多对象
浏览器url需要指明对象
http://localhost:8080/txkt/P/param2.action?u2.sid=001&u2.sname=“zhangsan”&u2.age=18
方法三
实现 ModelDriven<>方法,用的比较少,局限性比较大。
ParamAction3.java
package com.test.param;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
public class ParamAction3 extends ActionSupport implements ModelDriven<User>{
/**
*
*/
private User user=new User();
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
return "ok";
}
@Override
public User getModel() {
// TODO Auto-generated method stub
return user;
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
5、Action接收集合数组Map的情况
(1)简单数组
ParamAction4.java
package com.test.param;
import java.util.Arrays;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction4 extends ActionSupport{
/**
*
*/
private static final long serialVersionUID = 1L;
private String[] hobby;
public String[] getHobby() {
return hobby;
}
public void setHobby(String[] hobby) {
this.hobby = hobby;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(Arrays.asList(hobby));
return NONE;
}
}
<action name="param4" class="com.test.param.ParamAction4">
<result>
/index.jsp
</result>
</action>
浏览器输入:http://localhost:8080/txkt/P/param4.action?hobby=“001”&hobby=“002”&hobby=“003”
(2)对象数组
User类(属性封装类)
package com.test.param;
public class User {
private Integer sid;
private String sname;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "学号:"+sid+" 姓名:"+sname+" 年龄:"+age;
}
}
ParamAction5.java
package com.test.param;
import java.util.List;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction5 extends ActionSupport{
private static final long serialVersionUID = 1L;
private List<User> list;
public List<User> getList() {
return list;
}
public void setList(List<User> list) {
this.list = list;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(list);
return NONE;
}
}
<action name="param5" class="com.test.param.ParamAction5">
<result>
/index.jsp
</result>
</action>
test.jsp负责调用
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>对象数组</title>
</head>
<body>
<h2>复杂类型表单接收测试</h2>
<form action="<%=request.getContextPath()%>/P/param5.action" method="post">
<input type="text" name="list[0].sname" value="张三"><br>
<input type="text" name="list[1].sname" value="李四"><br>
<input type="text" name="list[0].sid" value="001"><br>
<input type="text" name="list[1].sid" value="002"><br>
<input type="text" name="list[0].age" value="22"><br>
<input type="text" name="list[1].age" value="21"><br>
<input type="submit">
</form>
</body>
</html>
(3)Map数组
User类(属性封装类)
package com.test.param;
public class User {
private Integer sid;
private String sname;
private Integer age;
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getSid() {
return sid;
}
public void setSid(Integer sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
@Override
public String toString() {
// TODO Auto-generated method stub
return "学号:"+sid+" 姓名:"+sname+" 年龄:"+age;
}
}
ParamAction6.java
package com.test.param;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
public class ParamAction6 extends ActionSupport{
private static final long serialVersionUID = 1L;
private Map<String, User> map;
public Map<String, User> getMap() {
return map;
}
public void setMap(Map<String, User> map) {
this.map = map;
}
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
System.out.println(map);
return NONE;
}
}
<action name="param6" class="com.test.param.ParamAction6">
<result>
/index.jsp
</result>
</action>
由test2.jsp调用
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>对象数组</title>
</head>
<body>
<h2>复杂类型表单接收测试</h2>
<form action="<%=request.getContextPath()%>/P/param6.action" method="post">
<input type="text" name="map['a'].sname" value="张三"><br>
<input type="text" name="map['b'].sname" value="李四"><br>
<input type="submit">
</form>
</body>
</html>