Struts2的经典入门
一:Struts2的起源与背景
在了解Struts2之前我们先来聊聊Struts1,我们都知道在很长的一段时间内,所有的MVC框架中,Struts1他是处于一个超级大咖的地位,无论是从市场角度和使用的用户的数量这个角度而言,Struts1它占用绝对地位,对于其他的MVC框架都不能和他媲美,但是Struts1作为一款优秀的MVC框架他可以很好的实现将控制与业务逻辑相分离,但他自身也存在一定的缺陷。
1.表现层支持单一:
Struts1框架只支持JSP作为其表现层使用,而很多的Java应用,在表现层技术选择时并不一定值使用JSP一种技术,可能会用到FreeMarker,PHP之类的技术等。
2.对Servlet API的依赖:
Struts1框架是基于Model II 模式开发而成的,因此他在开发中会运用到大量的Servlet API,而且我们都知道Servlet API 是要依赖于WEB容器进行初始化的,从而他进一步对WEB容器进行依赖。
3.不利于代码重用:
在Struts1开发的代码中除了自己自定义的类外,还必须使用Struts1中的某些类,这样会带来很多的弊端,与Struts1的类耦合在一起的代码很难再其他系统中进行二次重用。
所以根据以上Struts框架在设计上的缺点,Struts2以WebWork的设计思想为核心,WebWork虽然没有Struts1名气大但是在设计上他避免了S投入他说的弊端,它更强调系统之间的松耦合,使用拦截 器来实现控制,由于不在依赖Web容器,从而解决了框架对Servlet API紧密耦合。所以Strut2是吸收了Struts1的部分优点,建立了一个兼容Struts1和WebWork的MVC框架。
二:Struts2与其优势
Struts 2是一个MVC框架,以WebWork框架的设计思想为核心,吸收了Struts 1的部分优点
Struts 2拥有更加广阔的前景,自身功能强大,还对其他框架下开发的程序提供很好的兼容性
Struts官网
下载下来后的包:
apps目录:Struts2示例应用程序
docs目录:Struts2指南、向导、API文档
lib目录:Struts 2的发行包及其依赖包
src目录:Struts 2项目源代码
三:Struts2的初体验
1.在项目中引入Struts2
必须引入的包
struts2-core.jar——Struts2的核心包
xwork-core.jar——Command模式框架,WebWork和Struts2都基于xwork
commons-logging.jar——Java日志工具类包
freemarker.jar——模板引擎,一个基于模板生成文本输出的通用工具
ognl.jar——Object-Graph Navigation Language,表达式语言,用来获取和设置Java对象属性
可选包
antlr.jar——语法分析器
aopalliance.jar——AOP联盟标准接口
classworlds.jar——class对象管理
commons-beanutils.jar——Bean处理工具类包
commons-chain.jar——流程链处理模型,Struts2处理HTTP请求处理的基础机制
commons-collections.jar——Commons项目组中的一个各种集合类和集合工具类的封装
commons-digester.jar——解析xml转换成Java对象
commons-fileupload.jar——文件上传
commons-io.jar——IO工具类封装
commons-lang.jar——Commons项目中用来处理Java基本对象方法的工具类包
commons-logging-api.jar——Java常用日志工具调用,如通过API调用Log4J
commons-validator.jar——Java对象验证框架
json-lib.jar——用来映射JSON(JavaScript Object Notiation是一种文本格式)到Java Bean的Java类库
oro.jar——文本处理工具
sslext.jar——Struts框架的一个扩展可以让开发者配置Web应用程序在http与https协议之间进行自动转换(需配置)
插件包
struts2-embeddedjsp-plugin.jar——嵌入式JSP插件,可以让你从类路径或者Jar包里面调用JSP页面(官网翻译大概是这个意思)
struts2-convention-plugin.jar——用来实现Struts2零配置的插件包,可以结合这东西实现项目REST风格应用。
struts2-json-plugin.jar——Apache提供的JSON插件包
四:第一个Struts2程序
已我们最为熟悉的登录为例
1.新建一个web项目
2.引入所需jar包
3.在web.xml配置文件中配置我们的过滤器(使用Struts2的核心,不可忘记,在后面会详解)
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<display-name></display-name>
<!-- -->
<filter>
<filter-name>struts2</filter-name>
<!-- 使用Struts2的核心类库 -->
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 拦截所有的action -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>login.jsp</welcome-file>
</welcome-file-list>
</web-app>
4.准备我们需要的实体类(用户)
package cn.work.entity; //用户实体类
public class User {
private String username;// 用户名 private String password;// 密码 public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}
在Struts2中,可以直接使用Action类的属性来接收用户的输入,即当表单提交时,Struts2自动对请求参数进行转换,并对具有相同名字的Action属性进行赋值(通过setter方法)
在Struts2中,系统不会识别哪些属性用于接收请求参数,哪些属性用于输出处理结果。只要对属性设置了 setter和getter方法,该属性就可以被自动处理。
此外,Action类中还可以使用复杂的属性,如用户自定义的类,数组,集合对象等。
5.在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> <constant name="struts.ui.theme" value="simple" />
<constant name="struts.devMode" value="true" />
<!-- package元素用于定义Struts2处理请求的逻辑单元 -->
<package name="default" namespace="/" extends="struts-default">
<action name="login" class="cn.work.action.LoginAction2">
<result name="success">
success.jsp
</result>
<result name="login">
login.jsp
</result>
<result name="input">login.jsp</result>
</action>
</package> </struts>
1.package元素用于定义Struts2处理请求的逻辑单元,name属性为必需的并且唯一,用来指定包的名称(被其他包引用),extends属性类似java的extends关键字,用于指定要扩展的包。
2.action元素用于配置Struts2框架的“工作单元”Action类。action元素将一个请求的URI(action的名字)对应到一个Action类。name属性是必需的,用来表示action的名字,class属性可选,用于设定Action类的全限定名。
3.result元素用来设定Action类处理结束后,系统下一步将要做什么。name属性表示result的逻辑视图名称,必需与Action类返回的字符串进行匹配,而result元素的值表示与逻辑视图名称对应的物理资源之间的映射,用来指定这个结果对应的实际资源的位置。
注:在struts.xml文件中,每一个result属性的name名称都要与Action中返回的逻辑名称保持一致,否则,程序在运行时将无法正确运行。
6.创建一个继承了Action接口的LoginAction类
package cn.work.action; import java.util.ArrayList;
import java.util.List;
import java.util.Map; import cn.work.entity.User; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport; public class LoginAction extends ActionSupport implements Action {
/**
*
*/
private static final long serialVersionUID = 1L; private User user; private List<String> list; public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
}
public String execute() throws Exception {
if (user.getUsername().equals("张总")&&user.getPassword().equals("521")) { /**
* 1.Struts2访问ServletAPI对象
* 方式一:
**/
//获取session
Map<String, Object> session = ActionContext.getContext().getSession();
//将值存入session
session.put("username",user.getUsername()); return SUCCESS;
}else { return LOGIN;
}
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} //数据校验
public void validate(){
if (this.user.getUsername().length()==0) {
addFieldError("name2", "用户名不能为空");
}
if (this.user.getPassword().length()==0) {
addFieldError("pwd2", "密码不能为空");
}
} }
7.用于登录的login.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>登录页面</title>
</head> <body>
<div>
<h1>用户登录</h1>
<!-- 用于输出验证信息 -->
<s:fielderror />
<!-- 表单的提交 -->
<s:form action="login.action" method="post">
用户名:<s:textfield name="user.username" type="text" />
密码:<s:textfield name="user.password"type="password" />
<s:submit type="submit" value="登录"/>
</s:form>
</div>
</body>
</html>
8.成功的success.jsp页面
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";
%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>成功页面</title>
</head>
<body>
<h1>登录成功</h1>
<div>欢迎您,${session.username}</div>
<s:property value="user.username" />
<s:property value="user.password" />
</body>
</html>
先这样吧!这就是Struts2的入门,以后再继续探索Struts2的奥秘。。。
Struts2的经典入门的更多相关文章
- 《javascript经典入门》-day02
<javascript经典入门>-day02 1.使用函数 1.1基本语法 function sayHello() { aler('Hello'); //...其他语句... } #关于函 ...
- 《javascript经典入门》-day01
<javascript经典入门>-day01 1.了解JavaScript 01.浏览器每次加载和显示页面时,都在内存里创建页面及其全部元素的一个内部表示体系,,也就是DOM.在DOM里, ...
- Struts2的国际化入门
Struts2的国际化入门 Struts2国际化是建立在Java国际化的基础上的,一样是通过提供不同国家/语言环境的消息资源,然后通过ResourceBundle加载指定Locale对应的资源文件,再 ...
- struts2第一天——入门和基本操作
一.概述 1.运用场景: 应用于三层架构中web层的框架(显示层的运用),是经典MVC模型的web应用的变体. 2.与struts1的对比: struts2是在struts1基于webwork发展的全 ...
- Struts2第一个入门案例
一.如何获取Struts2,以及Struts2资源包的目录结构的了解 Struts的官方地址为http://struts.apache.org 在他的主页当中,我们可以通过左侧的Apache ...
- 1.struts2原理和入门程序
Struts2是一个MVC的Web应用框架,是在Struts1和WebWork发展起来的,以WebWork为核心,采取拦截器机制来处理用户请求. 原理图: 分析步骤: 1.用户发送一个请求 2.请求的 ...
- struts2框架快速入门小案例
struts2快速入门: index.jsp------>HelloAction--------->hello.jsp struts2流程 1.导入jar包 struts2的目录结构: a ...
- struts2学习笔记(一)—— struts2介绍及入门程序
一.struts2概述 1.1 什么是struts2? 在介绍Struts2之前,先来认识一下Struts1.Struts1是最早的基于MVC模式的轻量级web框架,他能够合理的划分代码结构,并包含了 ...
- [转载]MongoDB开发学习 经典入门
如果你从来没有接触MongoDB或对MongoDB有一点了解,如果你是C#开发人员,那么你不妨花几分钟看看本文.本文将一步一步带您轻松入门. 阅读目录 一:简介 二:特点 三:下载安装和开启服务器 四 ...
随机推荐
- Windows下Nginx配置SSL实现Https访问(包含证书生成)
Vincent.李 Windows下Nginx配置SSL实现Https访问(包含证书生成) Windows下Nginx配置SSL实现Https访问(包含证书生成) 首先要说明为什么要实现https ...
- 使用Nginx+Lua代理Hadoop HA
一.Hadoop HA的Web页面访问 Hadoop开启HA后,会同时存在两个Master组件提供服务,其中正在使用的组件称为Active,另一个作为备份称为Standby,例如HDFS的NameNo ...
- ABP源码分析八:Logger集成
ABP使用Castle日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方 ...
- JavaScript随笔5
事件(1) 鼠标的点击坐标: 火狐不支持 IE event.clientX//可视区坐标 event.clientY FF ev.clientX ev.clientY 兼容: var oEvent = ...
- java单例设计模式
单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...
- 理解 Neutorn LBaaS - 每天5分钟玩转 OpenStack(120)
Load Balance as a Service(LBaaS)是 Neutron 提供的一项高级网络服务.LBaaS 允许租户在自己的网络中创建和管理 load balancer. load bal ...
- 数据库日常维护-CheckList_01历史Agent Job执行情况检查
检查Agent Job中日常维护作业或业务作业是否成功,如每天的备份.碎片整理.索引维护.历史备份文件清除等,可利用SSMS工具,通过CDC下面设置好的DB Server List,运行下面脚本一次, ...
- Linux ERRNO
摘自Linux-3.18.20的头文件include/uapi/asm-generic/errno-base.h和include/uapi/asm-generic/errno.h: #define E ...
- nodejs中流(stream)的理解
nodejs的fs模块并没有提供一个copy的方法,但我们可以很容易的实现一个,比如: var source = fs.readFileSync('/path/to/source', {encodin ...
- 匹夫细说C#:委托的简化语法,聊聊匿名方法和闭包
0x00 前言 通过上一篇博客<匹夫细说C#:庖丁解牛聊委托,那些编译器藏的和U3D给的>的内容,我们实现了使用委托来构建我们自己的消息系统的过程.但是在日常的开发中,仍然有很多开发者因为 ...