前面我们讲到了,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;@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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 stubSystem.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{@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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;@Overridepublic String execute() throws Exception {// TODO Auto-generated method stub// requestString sid=request.getParameter("sid");System.out.println(sid);//responseresponse.getWriter().print("sid:"+sid);//sessionHttpSession 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";}@Overridepublic void setServletRequest(HttpServletRequest request) {// TODO Auto-generated method stubthis.request=request;}@Overridepublic void setServletResponse(HttpServletResponse response) {// TODO Auto-generated method stubthis.response=response;}@Overridepublic void setSession(Map<String, Object> session) {// TODO Auto-generated method stubthis.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;@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubHttpServletRequest request= ServletActionContext.getRequest();HttpServletResponse response= ServletActionContext.getResponse();   // requestString sid=request.getParameter("sid");System.out.println(sid);//responseresponse.getWriter().print("sid:"+sid);//sessionHttpSession 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;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "学号:"+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;// 对象1private User u;public void setU(User u) {this.u = u;}public User getU() {return u;}// 对象2private User u2;public void setU2(User u2) {this.u2 = u2;}public User getU2() {return u2;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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;@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubreturn "ok";}@Overridepublic User getModel() {// TODO Auto-generated method stubreturn 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;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "学号:"+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;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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;}@Overridepublic String toString() {// TODO Auto-generated method stubreturn "学号:"+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;}@Overridepublic String execute() throws Exception {// TODO Auto-generated method stubSystem.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>

Struts2进阶版相关推荐

  1. 特朗普“模仿”奥巴马?进阶版换脸技术DeepFakes来了

    整理 | 费棋 出品 | AI科技大本营 DeepFakes,这种能够移花接木的技术,它能将图像或视频中把一张脸替换成另一张脸. 去年 12 月,一个名 Reddit 用户用 DeepFakes 技术 ...

  2. 移动端页面自适应解决方案—rem布局(进阶版)

    之前的一篇<手机端页面自适应解决方案-rem布局>随着时间的推移,该方案已然过时,故为大家介绍一个目前我极力推荐使用的,更加完美的方案--rem布局(进阶版) 该方案使用相当简单,把下面这 ...

  3. 36篇博文带你学完opencv :python+opencv进阶版学习笔记目录

    基础版学习笔记传送门 36篇博文带你学完opencv :python3+opencv学习笔记汇总目录(基础版) 进阶版笔记 项目 opencv进阶学习笔记1: 调用摄像头用法大全(打开摄像头,打开摄像 ...

  4. Tensorflow详解保存模型(进阶版一):如何有选择的保存变量

    当然掌握了基础版还不够,我们来看一下进阶版一:如何有选择的保存变量: 这里还要另外涉及两个函数: tf.variable_scope("xxx") 和 tf.get_variabl ...

  5. kaggle (02) - 房价预测案例(进阶版)

    房价预测案例(进阶版) 这是进阶版的notebook.主要是为了比较几种模型框架.所以前面的特征工程部分内容,我也并没有做任何改动,重点都在后面的模型建造section Step 1: 检视源数据集 ...

  6. c++ 三次多项式拟合_线性回归进阶版,多项式线性回归讲解与实现(附完整代码)...

    每天给小编五分钟,小编用自己的代码,带你轻松学习深度学习!本文将会带你做完一个深度学习进阶版的线性回归---多项式线性回归,带你进一步掌握线性回归这一深度学习经典模型,然后在此基础上,小编将在下篇文章 ...

  7. 蓝桥杯 入门训练 A+B问题进阶版(两个3000位数的加法)

    自古码农出少年,年年都有"A+B" 自古码农出少年,年年都有"A+B" 自古码农出少年,年年都有"A+B" 问题描述 输入A.B,输出A+B ...

  8. python学习-- django 2.1.7 ajax 请求 进阶版

    #原来版本 $.get("/add/",{'a':a,'b':b}, function(ret){ $('#result').html(ret)}) #进阶版  $.get(&qu ...

  9. 手机端页面自适应解决方案—rem布局进阶版

    旧版rem布局 <手机端页面自适应解决方案-rem布局>, 此方案仅适用于移动端web 文章底部常见问题说明第四条,笔者已给出一个相当便捷的解决方案,欢迎留言交流.(2017/9/9) 该 ...

最新文章

  1. insert语句让我学会的两个MySQL函数
  2. linux avahi-daemon进程 网络服务 简介
  3. 详解JavaScript中的this
  4. IC/RFID/NFC 关系与区别
  5. oracle网络公开课《存储技术》课件和视频共享下载
  6. 如何用深度学习进行CT影像肺结节探测(附有基于Intel Extended Caffe的3D Faster RCNN代码开源)
  7. RUNOOB python练习题9 如何在代码中加入砸瓦鲁多
  8. PHP--去除字符串首尾空格
  9. 电信级的RSA加密后的密码的破解方法
  10. 百度分享自定义内容和图片
  11. IOS socket编程--Asyncsocket
  12. ubuntu下opencv和qt的安装配置
  13. sql查询非ascii字符_SQL替换:如何在SQL Server中替换ASCII特殊字符
  14. java des 加密 字符串_Java使用DES加密字符串
  15. C++实现数组类模板
  16. java反编译 编译_5个最佳Java反编译器
  17. leaflet接入百度影像地图(leaflet篇.34)
  18. 虚拟机安装centos7
  19. CF1375G Tree Modification
  20. 传统的人事管理与人力资源管理有什么区别,后者有了什么新突破?

热门文章

  1. Win XP中恢复受损的注册表
  2. 目标主机showmount -e信息泄露(CVE-1999-0554),如何禁止只允许特定主机使用showmount -e查看挂载列表
  3. SSD-主控、闪存和固件(转)
  4. 京东“鲸置”,“鲸吞”闲鱼?
  5. 【网络编程】TCP 网络应用程序开发
  6. U盘 如何自定义U盘图标并彻底隐藏配置文件
  7. Animator.paly 跳到动画结束
  8. 鹏哥C语言笔记分享P4
  9. [ZZ]通过修改键盘映射替代损坏按键
  10. c语言中static 变量