Struts2进阶版

前面我们讲到了,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.xml统一管理 (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>

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值