Struts2入门1 Struts2基础知识
Struts2入门1 Struts2基础知识 20131130
代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5
前言:
之前学习了Spring和Hibernate框架知识,因为Spring可以将Struts和Hibernate框架集成,所以还是要学习一些Struts框架技术。本章主要是Struts的简单介绍。
1.Struts2概述
Struts2是最流行的MVC框架技术,特使以WebWork和Struts1为基础,开发的新的框架技术,保留了Struts1的简单易用性,并且充分利用了WebWork的拦截器机制,也就是AOP的思想。
Struts2中大量的使用拦截器来处理用户请求,从而允许用户的业务逻辑控制器和ServletAPI分离,用户的请求交给Struts2的核心控制器FilterDispatcher。FilterDispatcher根据请求调用对应的Action的execute()方法,并且根据处理结果生成响应的JSP页面。Struts2框架内置了很多的拦截器,这些拦截器组成一个拦截器链,拦截器会自动队请求进行处理。
Struts2控制器组件是整个框架的核心,实际上,所有MVC框架都是以控制器组件作为核心的。Struts2的控制器组件有:FilterDispatcher和业务控制器Action组成。
1.1FilterDispatcher
FilterDispatcher是一个Servlet过滤器,他是Struts2的核心组件,作用于整个Web应用程序,需要在web.xml中配置Struts2的FilterDispatcher:
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.disaptcher.FilterDispatcher</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
上面配置了FilterDispatcher过滤器,他会对所有的请求都会过滤处理。任何需要与Web整合的MVC框架都是需要借助web.xml配置文件。通常MVC框架都需要在web应用中添加一个核心控制器。对于Struts2而言,就是加载FilterDispatcher组件。只要web应用加载了FilterDispatcher,FilterDispatcher就会加载对应的Struts2框架,因为FilterDispatcher是一个过滤器,Web应用加载FilterDispatcher只需要在web.xml中使用filter和filter-mapping元素配置FilterDispatcher即可。
2.Action
Action是Struts2的业务控制器
package com.yang.stru2.action;
public class LoginAction {
private String userName;
private String password;
public LoginAction(){}
public String getUserName(){return this.userName;}
public void setUSerName(String userName){ this.userName = userName;}
public String getPassword(){return this.password;}
public void setPassword(String password){ this.password =password;}
public String execute(){
System.out.println("userName:" + userName);
System.out.println("pasword:" + password);
if("yang".equals(userName) && "12345".equals(password)){
return "success";
}
return "error";
}
}
上述类不需要继承Struts2的任何类或是实现任何几口,是一个完全的POJO,重用性很高。Struts2中的Action有如下优势:
Action类完全是一个POJO,具有良好的代码重用性;Action类无需和ServletAPI耦合,因此无论是应用还是测试都是十分方便;Action中的execute()方法仅仅返回一个字符串作为处理结果,该处理结果可以映射带任何试图或者是另一个Action。
实际上,Struts2应用中起作用的业务控制器不是用户定义的Action而是系统生成的Action代理类,该Action代理类以用户定义的Action为代理目标。
1.3配置文件
使用Struts2创建系统的Action代理的时候,在web.xml中配置Struts2的拦截器,同时还要使用Struts2的配置文件,此文件中需要对用户定义的Action进行相关信息的配置。配置文件有两种:
配置Action的struts.xml
配置Struts2的全局属性的struts.properties文件
struts.xml
在struts.xml配置文件总需要配置系统用到的Action,在配置Action的时候,需要制定该Action的实现,并指定该Action处理结果和视图资源之间的映射关系。
<?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.devMode" value="true"/>
<!-- Struts2 的 Action 都必须在package 里 -->
<package name="com.yang.stru2.action" extends="struts-default" namespace="/admin">
<!-- 定义一个login的Action,实现类是com.yang.stru2.action.LoginAction -->
<action name="login" class="com.yang.stru2.action.LoginAction">
<!-- 配置execute()方法返回值对应的页面 -->
<result name="error">/error.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>
上述的struts.xml文件中,声明了一个Action,并且执行了Action的实现类是LoginAction,同时将execute()方法的返回值和视图资源之间的映射关系
struts.properties
在这个文件中可以配置Struts2的全局属性
#指定Web的默认编码集合,相当于调用HttpServletRequest的时候使用了setCharacterEncoding
struts.il8n.encoding=utf-8
#当修改struts.xml之后需要重新加载配置文件,在开发阶段打开
struts.configuration.xml.reload=true
#设置浏览器是否缓存静态诶荣,开发阶段最好关闭浏览器缓存
struts.serve.static.browserCache=false
1.4Struts2标签库
Struts的一个重要的组成部分就是标签库,提供了非常丰富的功能,这些标签不仅提供了表示层数据处理,而且提供了基本的流程控制,还提供了国际化支持、Ajax技术等功能。通过struts2标签库,可以减少代码的编写。
1.5Struts2的处理请求过程分析
Struts2一般只是用于Web框架:
1)客户段发出请求,比如/mypage.action
2)这个请求经过核心控制器FilterDispatcher过滤处理,FilterDispatcher将请求转交给响应的Action代理;
3)Action代理通过配置文件中的信息找到对应的Action类,创建Action对象并且调用对应的Action的代理
4)在调用Action的过程前后,设计相关拦截器的调用。拦截器链自动对请求应用通用功能,比如自动化工作流、验证或者是文件上传。
5)一旦Action执行完毕,Action的代理根据struts.xml中的配置信息找到execute()方法返回值对应的结果,返回结果通常是试图资源或者是另一个Action
2.基于Struts2的一个简单的应用
2.1配置应用环境
将Struts2核心类库放到Web项目中的lib目录下面:
all common package javaassist.jar
freemarket.jar,
ognl.jar
struts2-core.jar,
xwork.jar
同时需要修改web.xml的配置文件,加入Struts2的核心控制器FilterDispatcher,配置文件见上面的配置文件(其实这个和Servlet的配置方式是一样的)
2.2创建输出视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add JSP</title>
</head>
<body>
<h1>Struts2 Add Function </h1>
<form action="add.action" id="calcForm" method="post">
<table>
<tbody>
<tr>
<td>First Number:</td>
<td><input type="text" name="num1"/></td>
</tr>
<tr>
<td>Second Number:</td>
<td><input type="text" name="num2"/></td>
</tr>
<tr>
<td><input type="submit" value="加"/></td>
</tr>
</tbody>
</table>
</form>
</body>
</html>
表单提交的目标是add.action
2.3实现业务逻辑类
2.4实现业务逻辑类
package com.yang.stru2.service.impl;
public class Calculator {
public double add(double a ,double b){
return a+b;
}
public double substract(double a, double b){
return a-b;
}
public double multiply(double a, double b){
return a*b;
}
public double divide(double a, double b){
return a/b;
}
}
2.5实现业务控制器
package com.yang.stru2.action;
import com.opensymphony.xwork2.ActionContext;
import com.yang.stru2.logic.Calculator;
public class AddAction {
private double num1;
private double num2;
public double getNum1(){return this.num1;}
public void setNum1(double num1){this.num1 = num1;}
public double getNum2(){return this.num2;}
public void setNum2(double num2){this.num2= num2;}
public String execute(){
Calculator cal = new Calculator();
double result = cal.add(num1, num2);
ActionContext.getContext().getSession().put("result", result);
return "cal";
}
}
2.5配置业务控制器
创建一个struts.xml在scr目录下面,对AddAction进行配置:
<?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.devMode" value="true"/>
<!-- Struts2 的 Action 都必须在package 里 -->
<package name="com.yang.stru2.action" extends="struts-default">
<action name="add" class="com.yang.stru2.action.AddAction">
<result name="cal">/add_result.jsp</result>
</action>
</package>
</struts>
2.6创建结果视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Add result</title>
</head>
<body>
<h1>计算器结果</h1>
<table>
<tbody>
<tr>
<td>FirstNumber:</td>
<td>${param.num1 }</td>
</tr>
<tr>
<td>Second Number:</td>
<td>${param.num2 }</td>
</tr>
<tr>
<td>Result:</td>
<td>${sessionScope.result }</td>
</tr>
</tbody>
</table>
<button onclick="history.go(-1)">Return</button>
</body>
</html>
这样就可以运行了。
调试程序:
1.关于包添加的问题
我们这种菜鸟刚接触这个框架的时候,想到的就是将所有的包都放到应用中,对于其他的框架,暂时没有发现什么错误,但是对于这个Struts2,如果我们将所有的包都放入到项目中,就会发现运行报错,其实我也不知道为什么,其中的很多的包都是没有用的。经常长时间的调试,我找到了这些包,虽然不是完全精确,但是相对比较精简了,很多教材中说,只添加核心的5个包就可以了,反正就是运行失败。
我添加的包:将所有的common命名的开头的都添加进去,然后就是按几个比较关键的freemarket.jar, javaassist.jar, ognl.jar, struts2-core.jar, xwork-core.jar这些包就可以了。
2.调试WARNING
我们在web.xml配置文件中使用的是org.apache.struts2.dispatcher.FilterDispatcher,就会看提示,但不是使用红色的ERROR输出,提示我们这个FilterDispatcher已经过时了,推荐我们使用其他的FilterDispatcher。确实是这个样子的,我们根据WARNING提示,打开网页,推荐我们使用的是另一个比较新的FilterDispatcher,名字比较长
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
YangTengfei
2013.11.30
Struts2入门1 Struts2基础知识的更多相关文章
- Struts2入门2 Struts2深入
Struts2入门2 Struts2深入 链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h 前言: 前面学习那一节,搞得我是在是太痛苦了.因为在Web项目中确实不知 ...
- Hibernate入门1. Hibernate基础知识入门
Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...
- Python 入门之Python基础知识
Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...
- JAVAWeb入门之JSP基础知识
也是到了考试周,很多课都结了,准备去学点新东西.随后就开始自学JAVAWeb. 要学习JAVAWeb,首先需下面的知识: a) HTML/CSS/JS(前端页面),XML,JSON,vue ...
- Struts2入门(七)——Struts2的文件上传和下载
一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...
- Kinect for Windows SDK开发入门(二):基础知识 上
原文来自:http://www.cnblogs.com/yangecnu/archive/2012/03/31/KinectSDK_Application_Fundamentals_Part1.htm ...
- ios网络编程(入门级别)-- 基础知识
在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...
- 程序设计入门-C语言基础知识-翁恺-期中测试
一.试题 程序设计入门—C 语言期中测评 试题下载地址: http://nos.netease.com/edu-lesson-pdfsrc/217E194E46A6595A3F554380337490 ...
- PHP开发人员对JAVA的WEB开发入门(初版-基础知识)
最近准备对其他部门PHP开发的童鞋做一个对JAVA的培训.知己知彼,百战不殆,我要先了解点PHP,才能确认他们的基础,达到好的授课效果. PHP(原始为Personal Home Page的缩写,后正 ...
随机推荐
- java多线程学习-ThreadLocal
为了凑字,把oracle文档里介绍ThreadLocal抄过来 public class ThreadLocal<T> extends Object This class provides ...
- (转)对Oracle导出文件错误和DMP文件结构的分析,EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier
EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier 原因:oracle版本不一样 执行 C:/ ...
- mysql学习(2)-MySQL服务器优化
调优思路: 1.数据库设计与规划--以后再修该很麻烦,估计数据量,使用什么存储引擎 2.数据的应用--怎样取数据,sql语句的优化 3.mysql服务优化--内存的使用,磁盘的使用 4.操作系统的优化 ...
- 【JSP】自定义标签开发入门
JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...
- linux里添加locate命令
在linux里使用和find一样的功能 例如 find -name xx 可以yum install mlocate 然后 updatedb 再使用locate xx 来查找xx文件
- 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析
今天学习了scala的界定,先来看看下面这段代码 //class Pair[T] (val first : T,val second : T)class Pair[T <: Comparable ...
- css伪类运用
<!doctype html><html><head><meta charset="utf-8"><title>CSS输 ...
- NoSQL精粹(NoSQL Distilled)——序言
之前说到博客长草的问题,想了想除了很忙特别忙非常忙各种瞎忙忙你妹啊外,主要还是不知道写什么好--到这家公司的两年中从JS到领域驱动到缓存服务器从前端到后端各种折腾,有些东西虽然有所心得,不过既然前人已 ...
- WPF Dispatcher 一次小重构
几个月之前因为项目需要,需要实现一个类似于WPF Dispatcher类的类,来实现一些线程的调度.之前因为一直做Asp.Net,根本没有钻到这个层次去,做的过程中,诸多不顺,重构了四五次,终于实现, ...
- tar-usage
tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...