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基础知识的更多相关文章

  1. Struts2入门2 Struts2深入

    Struts2入门2 Struts2深入 链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h 前言: 前面学习那一节,搞得我是在是太痛苦了.因为在Web项目中确实不知 ...

  2. Hibernate入门1. Hibernate基础知识入门

    Hibernate入门1. Hibernate基础知识入门 20131127 前言: 之前学习过Spring框架的知识,但是不要以为自己就可以说掌握了Spring框架了.这样一个庞大的Spring架构 ...

  3. Python 入门之Python基础知识

    Python 入门之Python基础知识 1.变量 (1)变量就是把程序运行的中间结果临时存在内存中,以便后续代码使用 (2)变量的作用: 昵称,就是代指内存中某个地址中的内容 a = 123 变量名 ...

  4. JAVAWeb入门之JSP基础知识

    也是到了考试周,很多课都结了,准备去学点新东西.随后就开始自学JAVAWeb. 要学习JAVAWeb,首先需下面的知识: a)      HTML/CSS/JS(前端页面),XML,JSON,vue ...

  5. Struts2入门(七)——Struts2的文件上传和下载

    一.前言 在之前的随笔之中,我们已经了解Java通过上传组件来实现上传和下载,这次我们来了解Struts2的上传和下载. 注意:文件上传时,我们需要将表单提交方式设置为"POST" ...

  6. Kinect for Windows SDK开发入门(二):基础知识 上

    原文来自:http://www.cnblogs.com/yangecnu/archive/2012/03/31/KinectSDK_Application_Fundamentals_Part1.htm ...

  7. ios网络编程(入门级别)-- 基础知识

    在学习ios的过程中,停留在UI控件很长时间,现在正在逐步的接触当中!!!!!!在这个过程中,小编学到了一些关于网络编程知识,并且有感而发,在此分享一下: 关于网络请求的重要性我想不用多说了吧!!!对 ...

  8. 程序设计入门-C语言基础知识-翁恺-期中测试

    一.试题 程序设计入门—C 语言期中测评 试题下载地址: http://nos.netease.com/edu-lesson-pdfsrc/217E194E46A6595A3F554380337490 ...

  9. PHP开发人员对JAVA的WEB开发入门(初版-基础知识)

    最近准备对其他部门PHP开发的童鞋做一个对JAVA的培训.知己知彼,百战不殆,我要先了解点PHP,才能确认他们的基础,达到好的授课效果. PHP(原始为Personal Home Page的缩写,后正 ...

随机推荐

  1. java多线程学习-ThreadLocal

    为了凑字,把oracle文档里介绍ThreadLocal抄过来 public class ThreadLocal<T> extends Object This class provides ...

  2. (转)对Oracle导出文件错误和DMP文件结构的分析,EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier

    EXP-00008: 遇到 ORACLE 错误 904 ORA-00904: "MAXSIZE": invalid identifier 原因:oracle版本不一样 执行 C:/ ...

  3. mysql学习(2)-MySQL服务器优化

    调优思路: 1.数据库设计与规划--以后再修该很麻烦,估计数据量,使用什么存储引擎 2.数据的应用--怎样取数据,sql语句的优化 3.mysql服务优化--内存的使用,磁盘的使用 4.操作系统的优化 ...

  4. 【JSP】自定义标签开发入门

    JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...

  5. linux里添加locate命令

    在linux里使用和find一样的功能 例如 find -name xx 可以yum install mlocate 然后 updatedb 再使用locate xx  来查找xx文件

  6. 第43讲:Scala中类型变量Bounds代码实战及其在Spark中的应用源码解析

    今天学习了scala的界定,先来看看下面这段代码 //class Pair[T] (val first : T,val second : T)class Pair[T <: Comparable ...

  7. css伪类运用

    <!doctype html><html><head><meta charset="utf-8"><title>CSS输 ...

  8. NoSQL精粹(NoSQL Distilled)——序言

    之前说到博客长草的问题,想了想除了很忙特别忙非常忙各种瞎忙忙你妹啊外,主要还是不知道写什么好--到这家公司的两年中从JS到领域驱动到缓存服务器从前端到后端各种折腾,有些东西虽然有所心得,不过既然前人已 ...

  9. WPF Dispatcher 一次小重构

    几个月之前因为项目需要,需要实现一个类似于WPF Dispatcher类的类,来实现一些线程的调度.之前因为一直做Asp.Net,根本没有钻到这个层次去,做的过程中,诸多不顺,重构了四五次,终于实现, ...

  10. tar-usage

    tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个,可以和别的命令连用但只能用其中一个.下面的 ...