2. Struts2 基础
1. Struts2简介
- Struts2是一个WEB端MVC框架。作为比较早的MVC 框架之一,Struts2在使用中还是比较多的。虽然个人感受没有SpringMVC还那么的好用
- Struts2 官网
- 在Model2中我们使用Servlet作为控制器:
- Servlet主要负责:
- 接收用户发送的请求
- 将请求参数封装为Java中的对象
- 调用service来处理业务逻辑
- 根据service返回的结果,选择视图
- Servlet主要负责:
2. Struts2-HelloWorld
- 新建一个Maven 的webapp 项目
- 在这里我给出一个简单的 pom.xml 文件依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- javax JSTL的API-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.5</version>
</dependency>
</dependencies>
- 在web.xml 文件中,我们需要配置 Struts2 用到的 filter 过滤器
<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>
- 编写一个Action 类 Helloworld :里面就一个方法
public String hello (){
System.out.println("UserAction-hello...........");
return "success";
}
- 在 resources 文件夹下 我们需要新增一个XML文件,叫做 struts.xml 文件。需要在里面配置一个最简单的 action.
<struts>
<constant name="struts.devMode" value="true"/>
<package name="default" namespace="/" extends="struts-default">
<action name="hello" class="org.pan.struts2.Helloworld">
<result name="success">/WEB-INF/views/success.jsp</result>
</action>
</package>
- 我们在 index.jsp 页面写一个超链接,
<a href="${pageContext.request.contextPath}/hello">HelloWorld</a>我们发现能够正常的跳转到 success (该页面就不写了,自己添加)。说明我们struts2 的HelloWorld 正常了
- action VS Action
- action: 应用程序可以完成的每一个操作. 例如: 我们请求 hello
- Action类: 普通的 Java 类, 可以有属性和方法, 同时必须遵守下面这些规则:
- 属性的名字必须遵守与 JavaBeans 属性名相同的命名规则. 属性的类型可以是任意类型. 从字符串到非字符串(基本数据库类型)之间的数据转换可以自动发生
- 必须有一个不带参的构造器
- 至少有一个供 struts 在执行这个 action 时调用的方法
- 同一个 Action 类可以包含多个 action 方法.
- Struts2 会为每一个 HTTP 请求创建一个新的 Action 实例
Action接口(不常用)
- 我们也可以通过实现Action接口来创建一个Action类。
- 这个接口中为我们提供了几个结果类型的常量
- 还提供了一个抽象的execute方法
ActionSupport:
- 我们开发中大部情况Action类都会继承ActionSupport类。
- ActionSupport 实现类Action等接口。
- ActionSupport 对国际化、验证等做了很好的支持。
3. 在Action 中获取Web 资源- Servlet 相关API
在 Action 类中获取 Servlet 相关的API,主要分为两种:
- 一种是 Struts2 封装好的 Map结构:
- Map<String, Object> session
- Map<String, Object> application
- Map<String,Object> requestMap
- 另一种是 Servlet 原生的API
- request
- session
- application
- 一种是 Struts2 封装好的 Map结构:
获取 Struts2 封装的相关 Map
- 与 Servlet API 解耦的访问方式
为了避免与 Servlet API 耦合在一起, 方便 Action 做单元测试, Struts2 对 HttpServletRequest, HttpSession 和 ServletContext 进行了封装, 构造了 3 个 Map 对象来替代这 3 个对象, 在 Action 中可以直接使用 HttpServletRequest, HttpServletSession, ServletContext 对应的 Map 对象来保存和读取数据.
方式一:
- Struts2 封装的API: com.opensymphony.xwork2.ActionContext
- ActionContext 对象保存当前Action上下文内容,也就是当前Action的相关对象都可以通过ActionContext获取。
- ActionContext 内部维护了一个Map集合,我们这些对象在Map集合中保存,可以通过key获取value。
- 在 ActionContext 中保存对象都是域对象中的Map,而不是我们属性HttpServletRequest、HttpSession、ServletContext
- 我们通过操作Map实际上就是间接的操作域中的属性
方式二:实现XxxAware接口:
org.apache.struts2.interceptor.ApplicationAware;org.apache.struts2.interceptor.ParameterAware;在2.5.5版本之后,废弃了该接口,使用org.apache.struts2.dispatcher.HttpParametersorg.apache.struts2.interceptor.RequestAware;org.apache.struts2.interceptor.SessionAware;- 这四个接口都有对应set方法,当我们实现了这些接口,Struts2 会自动调用set方法,将对应的 Map 设置进Action对象
- 与 Servlet API 解耦的访问方式
/**
* 方式二: 实现 XxxxAware 的接口的方式来 Set 各种解耦的ServletAPI
*/
public class UserAction extends ActionSupport implements ApplicationAware, SessionAware, RequestAware, HttpParametersAware {
/**
* 方式二可以在多个方法中公用这些 ServletAPI
*/
private Map<String, Object> application;
public void setApplication(Map<String, Object> application) {
this.application = application;
}
private HttpParameters parameters;
public void setParameters(HttpParameters parameters) {
this.parameters = parameters;
}
private Map<String, Object> request;
public void setRequest(Map<String, Object> request) {
this.request = request;
}
private Map<String, Object> session;
public void setSession(Map<String, Object> session) {
this.session = session;
}
/**
* 方式一: 通过 ActionContext 的方式获取解耦的 ServletAPI
*
* @return
*/
public String getServletAPI_ActionContext() {
//与Servlet 解耦的方式获取 Struts2 封装的 API
ActionContext actionContext = ActionContext.getContext();
Map<String, Object> session = actionContext.getSession();
//注意session的真实类型是SessionMap,它的内部保存一个Session对象
//可以通过该对象invalidate方法来使session失效
SessionMap sessionMap = (SessionMap) session;
sessionMap.invalidate();
Map<String, Object> application = actionContext.getApplication();
// requestMap 获取比较特殊,使用get 方法获取
Map<String, Object> request = (Map<String, Object>) actionContext.get("request");
HttpParameters parameters = actionContext.getParameters();
Map<String, String[]> parametersMap = parameters.toMap();
session.put("seeesionKey", "sessionValue");
application.put("applicationKey", "applicationValue");
request.put("applicationKey", "applicationValue");
parametersMap.put("parametersMapKey", new String[]{"parametersMapValue"});
return SUCCESS;
}
}
- 与 Servlet API 耦合的访问方式
- 直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试
- 方式一: 通过 org.apache.struts2.ServletActionContext
- 方式二:ServletXxxAware :
- 让 Action 实现 ServletRequestAware , ServletContextAware, ServletRequestAware 三个接口
- 这两个接口中定义相关对象 set 方法,当我们这些接口时,Struts2 会自动调用方法设置相应的对象
- 直接访问 Servlet API 将使 Action 与 Servlet 环境耦合在一起, 测试时需要有 Servlet 容器, 不便于对 Action 的单元测试
/**
* 方式二: 实现 ServletXxxxAware 接口的方式
*/
public class ServletAPITest extends ActionSupport implements ServletRequestAware, ServletContextAware, ServletResponseAware{
private HttpServletRequest request;
private ServletContext context;
private HttpServletResponse response;
private HttpSession session;
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletContext(ServletContext context) {
this.context = context;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
/**
* Session 比较特殊,我们可以在用的时候通过 request 来获取
*/
private void testGetSession(){
if (request != null){
session = request.getSession();
}
}
/**
* 方式一: 通过 org.apache.struts2.ServletActionContext 的静态方法来获取这些原生的 ServletAPI
* @return
*/
public String testServletAPI_ServletActionContext(){
ActionContext context = ServletActionContext.getContext();
HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
//Session 可以通过 request 来获取
HttpSession session = request.getSession();
return SUCCESS;
}
}
2. Struts2 基础的更多相关文章
- Struts2入门1 Struts2基础知识
Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...
- Struts2基础学习2
Struts2基础学习2 项目结构,测试页面与实体类 <%@ page language="java" contentType="text/html; charse ...
- Struts2基础入门
Struts2基础入门 创建一个web工程 0)导包并且创建一个核心配置文件 <?xml version="1.0" encoding="UTF-8"?& ...
- Struts2基础学习总结
引用自:http://www.cnblogs.com/jbelial/archive/2012/05/10/2486886.html Struts 2是在WebWork2基础发展而来的. 注意:str ...
- 经典MVC框架技术-struts2基础知识
Struts2框架简介 struts2框架是在struts1和webwork技术的基础上,进行合并的全新框架,struts2以Webwork为核心,采用拦截器来处理用户的请求,这样的设计使得业务逻辑控 ...
- Struts2框架学习第三章——Struts2基础
本章要点 — Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 — WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...
- (一)Struts2 基础
一.Struts简介 1.1 历史 虽然Struts 2号称是一个全新的框架,但这仅仅是相对Struts 1而言.Struts 2与Struts 1相比,确实有很多革命性的改进,但它并不是新发布的新框 ...
- struts2 基础
框架(frameWork):某一种应用的半成品 struts2: 表现层 处理与页面进行交互的相关功能 hibernate: 持久层 负责业务逻辑数据的持久化 spring: 业务层 负责复杂的业 ...
- struts2 基础学习
Struts 2是在WebWork2基础发展而来的. 注意:struts 2和struts 1在代码风格上几乎不一样. Struts 2 相比Struts 1的优点: 1.在软件设计上Struts ...
随机推荐
- Tcp/ip 报文解析
在编写网络程序时,常使用TCP协议.那么一个tcp包到底由哪些东西构成的呢?其实一个TCP包,首先需要通过IP协议承载,而IP报文,又需要通过以太网传送.下面我们来看看几种协议头的构成 一 .Ethe ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- 【组织级项目管理】P2 MSP P3O
组织级项目管理--有你,有我,有大家 在过去的2年,无论对于企业来讲,还是对于我们个人都有很多大脑的冲击,有几个词大家应该特别耳熟能详:转型,变革,敏捷,互联网+,组织的项目化管理等.就是这些让我们的 ...
- 引人瞩目的 CSS 变量(CSS Variable)
这是一个令人激动的革新. CSS 变量,顾名思义,也就是由网页的作者或用户定义的实体,用来指定文档中的特定变量. 更准确的说法,应该称之为 CSS 自定义属性 ,不过下文为了好理解都称之为 CSS 变 ...
- Redis简单案例(二) 网站最近的访问用户
我们有时会在网站中看到最后的访问用户.最近的活跃用户等等诸如此类的一些信息.本文就以最后的访问用户为例, 用Redis来实现这个小功能.在这之前,我们可以先简单了解一下在oracle.sqlserve ...
- BPM任务管理解决方案分享
一.方案概述任务是企业管理者很多意志的直接体现,对于非常规性事务较多的企业,经常存在各类公司下达的各种任务跟进难.监控难等问题,任务不是完成效果不理解,就是时间超期,甚至很多公司管理层下达的任务都不了 ...
- 1.Hibernate简介
1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发; b.大大减少代码量; c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...