配置Struts2及Struts2访问servlet api的方式
Struts2的起源与背景
在很长的一段时间内,在所有的MVC框架中,Struts1处于绝对的统治地位,无论是从市场的普及范围,还是具体的使用者数量。 其他MVC框架都无
法与其相比,作为一一款优秀的MVC框架、虽然Struts1可以很好地实现将控制与业务逻辑相分离, 但是其自身也存在一定的缺陷,这些缺陷体
现在以下几方面。
1.表现层支持单
Struts1框架只支持JSP作为其表现层使用,而很多的Java应用,在表现层技术选择时并不一定只使用JSP-种技术,如FreeMarker. Velocity 等。这是
因为Struts1框架的出现远在这些页面技术出现之前。而当多形式的视图技术出现后,Stuts 1又无法与这些视图技术进行整合.从而限制了Stuts 的发展。
2.对Serwet AP的依赖
3.不利于代码重用
在Seuts 1开发的代码中除了自己定义的类外,还必须使用Struts1中的某些类(如ActionForm),这样带来的弊端是,与Struts1的类耦合在一起的代码很难在其他的系统中进行重用。
Struts所需jar
第一步首先创建一个web项目并导入jar
创建项目和导入就不多说了,jar地址如下
链接:https://pan.baidu.com/s/1gnf_15iSkl-2Xu6YmzV17g
提取码:bcl5
配置web.xml
在web.xml中添加如下配置
<!-- 配置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>
创建一个页面如下
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!-- 导入标签库 -->
<%@taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'helloWorld.jsp' starting page</title>
</head>
<body>
<div>
<!-- 获取action中的message属性 -->
<h1><s:property value="message"/></h1>
</div>
<div>
<form action="helloWorld.action" method="post">
请输入您的用户名:<input type="text" name="name" >
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
创建类 用于对用户的请求做出处理
package cn.ssh.ch08;
import com.opensymphony.xwork2.Action;
public class HelloWorldAction implements Action {
//用户输入的名字 对应jsp页面input框的名称
private String name="";
//向用户显示的信息 对应jsp页面的 message
private String message="";
/*
* 当处理用户请求时,默认配置下调用的方法
*/
@Override
public String execute() throws Exception {
// TODO Auto-generated method stub
this.setMessage("Hello !" +this.getName());
return Action.SUCCESS;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
上面不实现Action接口继承ActionSupport类也可以
Action接口中常量字符的逻辑含义
|
常量 |
值 |
逻辑含义 |
|
SUCCESS |
“success” |
表示程序正常处理,并返回给用户成功后的结果 |
|
NONE |
“none” |
表示处理正常结束,但不返回给用户任何显示 |
|
ERROR |
“error” |
表示处理结果失败 |
|
INPUT |
“input” |
表示需要更多用户输入才能执行 |
|
LOGIN |
“login” |
表示需要用户正确登录后才能执行 |
需要其他的结果也可以自己去写
创建Struts2的配置文件
在SRC目录下创建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>
<!-- 创建一个default包,继承Struts2的struts-default包 -->
<package name="default" namespace="/" extends="struts-default">
<!-- 接收处理用户的/helloworld.action请求,并根据返回结果进行跳转 -->
<action name="helloWorld" class="cn.ssh.ch08.HelloWorldAction">
<!-- 结果为 "success"时,跳转至 helloWorld.jsp-->
<result name="success">/helloWorld.jsp</result>
</action>
</package>
</struts>
如果没有头文件可以去到jar中去找, 如下

打开之后,头文件如下

测试
配置好后我们就可以测试运行了


执行流程
- 当浏览器发出helloWorld.action请求
- 服务器接收后,根据web.xml配置,将请求发送给指定的过滤器
- 过滤器根据struts.xml中的配置将请求发送给HelloWorldAction类的对象并调用默认的execute方法;
- 根据方法的返回结果在struts,xml文件中匹配处理结果,完成页面的跳转
可以发现输入提交后文本框中的值就没了,更改的代码如下
<div>
<form action="helloWorld.action" method="post">
请输入您的用户名:<s:textfield name="name" theme="simple"/>
<input type="submit" value="提交">
</form>
</div>
运行

此外可以发现并没有非空验证

那么我想用如果是空值则给予提醒,因为为接口没有提供对非空的验证所以换成继承.

重写如下方法
@Override
public void validate() {
if (name.length()==0) {
addFieldError("name_is_null", "名称不能为空");
}
}
添加效验信息后Struts2框架会根据action的配置跳转到结果名为input的视图页面,因此在需要在struts.xml中添加一个名为input的result
<action name="helloWorld" class="cn.ssh.ch08.HelloWorldAction">
<!-- 结果为 "success"时,跳转至 helloWorld.jsp-->
<result name="success">/helloWorld.jsp</result>
<!-- 当有 效验信息时 跳转到helloWorld.jsp -->
<result name="input">/helloWorld.jsp</result>
</action>
在jsp中添加如下代码,进行显示
<div>
<!-- 显示效验信息 -->
<s:fielderror fieldName="name_is_null"/>
</div>
测试

Struts2访问servlet api的方式
为了能够实现对servlet api对象的访问,Struts2提供了多种方式,归结起来可分为两大类:与servlet api解耦的方式访问和servlet api耦合的访问方式
区别:解耦并不直接依赖原生servlet api,耦合则直接依赖于原生api
servlet解耦方式访问
为了避免servlet api耦合在一起,方便action类,Struts2框架使用普通的map对象替代了servlet API中的HttpServletRequest,HttpSession和
ServletContext对应的Map对象.Struts2提供了 com.opensymphony.xwork2.ActionContext类来获取Servlet API对象对应的Map对象,可以通过如下方法获取
- Map getSession() : 可获取Session
- Map getApplication() : 可获取Application
- object get(String key) : 可用来获取request,application,session,一般只是用来获取request因为没有单独获取它的方法
假设我们需要保存用户名
public String execute() throws Exception {
this.setMessage("Hello !" +this.getName());
ActionContext ac=ActionContext.getContext();
//获取session和application
/*Map<String, Object> session = ac.getSession();
Map<String, Object> aMap =ac.getApplication();*/
//获取request
Map<String, Object> rMap = (Map<String, Object>) ac.get("request");
//保存用户名
rMap.put("NAME", getName());
//返回 success
return Action.SUCCESS;
}
jsp页面
<div>
<!-- 获取action中的message属性 -->
<h1><s:property value="message"/></h1>
<!-- 显示用户名 -->
<p>获取保存的名称:${NAME}</p>
</div>
结果

servlet api耦合的访问方式
直接访问Servlet API将使Action类与Servlet API耦合在一起,因为Servlet API对象均由Servlet容器来构造,与这些对象绑定在一起,
测试过程中就必须有Servlet容器,这样不便于Action的测试,但是有时候,确实需要直接访问这些对象,直接访问方式如下
//耦合获取
HttpServletRequest request= ServletActionContext.getRequest();
ServletContext sContext= ServletActionContext.getServletContext();
HttpServletResponse response= ServletActionContext.getResponse();
HttpSession session =request.getSession();
session.setAttribute("NMAE", getName());
如何选择访问Servlet API的方式
- 能使用解耦方式访问尽量不要用耦合方式
- 除非需要使用耦合方式独有的方法 如:request.getServletPath(),getPathInfo(),getContextPaht(),getRequsetURI()等等
配置Struts2及Struts2访问servlet api的方式的更多相关文章
- struts2 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- struts2的action访问servlet API的三种方法
学IT技术,就是要学习... 今天无聊看看struts2,发现struts2的action访问servlet API的三种方法: 1.Struts2提供的ActionContext类 Object g ...
- 笔记01 登录、常用配置参数、Action访问Servlet API 和设置Action中对象的值、命名空间和乱码处理、Action中包含多个方法如何调用
Struts2登录 1. 需要注意:Struts2需要运行在JRE1.5及以上版本 2. 在web.xml配置文件中,配置StrutsPrepareAndExecuteFilter或FilterDis ...
- Struts2学习二----------访问Servlet API
© 版权声明:本文为博主原创文章,转载请注明出处 Struts2提供了三种方式去访问Servlet API -ActionContext -实现*Aware接口 -ServletActionConte ...
- Struts2笔记--Action访问Servlet API
Web应用中通常需要访问的Servlet API就是HttpServletRequest.HttpSession和ServletContext,这三个接口分别代表JSP内置对象中的request.se ...
- Struts 2 访问Servlet API的方式
与Servlet API解耦的访问方式 与Servlet API耦合的访问方式 (tips:耦合既依赖) 1. 与Servlet API解耦的访问方式 2. 与Servlet API耦合 ...
- Struts2学习笔记(五)——Action访问Servlet API
在Strut2中访问Servlet API有三种方式: 1.通过ActionContext访问Servlet API,推荐使用这种,但是这种方案它获取的不是真正的事Servlet API. 步骤: 1 ...
- 关于Struts2自动装配和访问Servlet API
自动装配 1.根据属性的getter和setter获取值 index.jsp <s:form action="hello" method="POST"& ...
- struts2访问servlet API
搭建环境: 引入jar包,src下建立struts.xml文件 项目配置文件web.xml. web.xml: <?xml version="1.0" encoding=&q ...
随机推荐
- JSTL标签概述
什么是JSTL JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断.数据管理格式化. ...
- 如何禁用 Azure 虚拟机的日期时间同步
问题描述 由于 Azure 虚拟机的特殊性,物理主机会实时同步虚拟机的时间和日期.当有特殊需求时,客户想要停止日期时间的同步,但是一些常见的关闭 NTP 服务等操作都会失败. 解决方案 Importa ...
- 【Leetcode】【Easy】Minimum Depth of Binary Tree
Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the shor ...
- Smokeping外置邮箱告警
wget http://xrl.us/cpanm -O /usr/bin/cpanm 1.安装Authen::SASL模块 cpanm --mirror http://mirrors.163.com/ ...
- April 2 2017 Week 14 Sunday
You only live once, but if you do it right, once is enough. 人生只有一次,但如果活对了,一次也就够了. Maybe I am going t ...
- 我的HTML总结之常用基础便签
HTML:是Hyper Text Markup Language(超级文本标记语言)的缩写,HTML不是一种程序,只是一种控制网页中数据显示的标识语言. HTML由一组标签组成. HTML的基本结构 ...
- unity的默认文件目录及脚本之间的执行顺序
在unity中,有几个默认的文件目录,这些目录对于开发者来说是非常重要的,今天记录一下这些目录的功能和一些相关的知识 大神雨松给出的帖子我个人觉得还是很有价值的,附上链接 http://www.xua ...
- SpringCloud实战3-Hystrix请求熔断与服务降级
我们知道大量请求会阻塞在Tomcat服务器上,影响其它整个服务.在复杂的分布式架构的应用程序有很多的依赖,都会不可避免地在某些时候失败.高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险 ...
- 牛客练习赛20(ABC)
A. 礼物 题意: 我从买奥利奥的事情中想出了一个算法题:假设某个店铺有N种不同类型的1元奥利奥和M种不同类型的2元奥利奥,而且余量无限,我的钱有k元,我想把k元都用来买奥利奥,且可以买同类型的奥利奥 ...
- nbu集群Alwayson相关问题
Alwayson 1. Alwayson 是否依赖于域环境? 答: 是, alwayson依赖于故障转移群集(只有在故障转移群集中的SQL Server 才能启动高可行性组功能),而故障转移群集愈依赖 ...