第十部分_Struts2.1详述与MVC设计模式

讲了诸多原理性的东西,下面该来看看如何实践了:

首先,在MyEclipse中新建一个Web Project,命名为struts2(注意这里我用的版本是struts2.1.6),规范级别选择Java EE 5.0,当然了,我们仍然需要告诉Tomcat我们的项目在哪里,因此到Tomcat安装目录下的conf文件夹下的server.xml文件,为了节约时间,我们把test项目的上下文放到注释中,以免每次启动tomcat,都要加载该项目,相关配置部分如下:

 <!--
        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
<Context path="/test" docBase="D:\JavaWeb\test\WebRoot" reloadable="true"/>

        -->

<Context path="/struts2" docBase="D:\JavaWeb\struts2\WebRoot" reloadable="true"/>

      </Host>
    </Engine>
  </Service>
</Server>

重启tomcat服务器,访问http://localhost:8080/struts2,页面出现"This is my JSP page." 表示我们的项目已经纳入Tomcat的管理之下了。我们将structs2框架集成到我们新建的项目中,其实就是将structs2提供的JAR包添加到项目了,其中我们需要的JAR包有(在解压好的structs的解压文件中的lib目录下)commons-fileupload-1.2.1.jar、commons-logging-1.0.4.jar、freemarker-2.3.13.jar、ognl-2.6.11.jar、struts2-core-2.1.6.jar、xwork-core-2.1.2.jar共六个文件选中复制,回到MyEclipse,粘贴到WebRoot下面的WEB-INF下的lib目录下,这样这些第三方库就可以为我们所用了。

下面,我们用struts2写一个经典的hello world,标志学习struct2的起步:

在WebRoot下新建一个helloworld.jsp文件,将body中的内容更改为Hello World。当然我们可以直接访问http://localhost:8080/struts2/helloworld.jsp。但是这里我们通过struct2的控制实现间接访问:在src目录下新建一个包com.test.action,然后再改包下建立一个名为helloworld的类,定义一个execute方法:

package com.test.action;

public class helloworld
{
	public String execute() throws Exception
	{
		return "success";
	}
}

struts2的一个核心的东西是一个配置文件,该文件的默认名字为struts.xml,这个文件就描述了整个流程的转发以及执行过程。在src下新建一个名为struts的xml文件,解压缩struts2目录下的apps下的struts2-blank文件,展开下面的WEB-INF,打开src,打开java,找到struts.xml文件,打开将其头部的dtd(验证我们的struts.xml文件)信息粘贴到我们的新建的xml文件中:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">

利用MyEclipse的提示功能完整的xml文件内容如下:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"    "http://struts.apache.org/dtds/struts-2.0.dtd">
	<struts>

		<package name="struts2" extends="struts-default">

			<action name="helloworld" class="com.test.action.HelloWorld">
				<result name="success">/helloworld.jsp</result>
			</action>
		</package>

	</struts>

  MyEclipse会自动的把这个文件copy一份复制到项目的WEB-INF目录下的classes目录下,我们之所以建立在src目录下,是为了在IDE中可以编辑它。

接下来,在web.xml中配置如下(配置之前需要的相关信息可以在D:\Program Files\struts-2.1.6\docs\struts2-core\apidocs里找到index.html中找到org.apache.struts2包下面的FilterDispatcher类,里面有一个信息:Deprecated. Since Struts 2.1.3, useStrutsPrepareAndExecuteFilter instead orStrutsPrepareFilter and StrutsExecuteFilter if needing using the ActionContextCleanUp filter in addition to this one,用来提示我们用新的类代替旧的类,可以看到StrutsPrepareAndExecuteFIlter的包名为:org.apache.struts2.dispatcher.ng.filter

):

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
	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_2_5.xsd">

  <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>

</web-app>

注意:过滤器也是在web应用启动的时候被加载的,相当于servlet配置了一个load-on-startup属性一样。

访问http://localhost:8080/struts2/helloworld.action,输出hello world即为成功。

最后,最重要的事情是,程序的运转流程:

首先我们在地址栏键入http://localhost:8080/struts2/helloworld.action,请求访问helloworld.action这个资源,请求到达了Tomcat服务器端,于是Tomcat到web.xml中找到了filter-mapping,因为其url-pattern被我们设定为/*,于是所有的客户想要访问的所有资源都需要经它过滤,经filter-name找到相应的filter(web应用启动时便被加载了),这里就是我们的struts2,根据这个filter-name找到响应的filter-class:org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter,流程转到struts.xml中,首先找到相应的包:struts2,然后找相应的action:name属性为helloworld,与该名字所对应的是class:com.test.action.HelloWorld进行处理,流程转到HelloWorld类,执行其execute方法,返回值为success,之后流程又返回到struts.xml中的action,找到result中name属性为success的,于是流程转到helloworld.jsp,于是我们的hello world输出来了。

此外一个,可能的疑惑是,一个客户请求对应一个request和response,作为doGet和doPost的两个参数,为什么我们整个过程中都没有看到过request和response对象呢,然而程序仍然能正常运转,但是,这只是表面上来看是这样的,底层它既然是基于HTTP协议的一个框架,肯定是有request和response,只不过struts2巧妙的把它们隐藏起来了,因此我们看不到他们。

上面的程序是处理一个静态的页面,下面我们来一个复杂点的,涉及到动态的页面。下面我们就用struts2来实现一个简单的登录系统:

首先新建一个login.jsp:

<body>
  <form action="login.action">
    username: <input type="text" name="username" size="20"/><br>
    password: <input type="password" name="password" size="20"/><br/>

    <input type="submit" value="submit">
   </form>
  </body>

然后,新建一个类,名为LoginAction(其中的username 和 password作为成员变量必须与表单中的一致,并且为其生成set和get注入方法):

package com.test.action;

public class LoginAction
{
	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;
	}

	public String execute() throws Exception
	{
		return "success";
	}
}

接下来,配置struts.xml,在原来的基础上增加一个名为login的action:

<struts>

		<package name="struts2" extends="struts-default">

			<action name="helloworld" class="com.test.action.HelloWorld">
				<result name="success">/helloworld.jsp</result>
			</action>

			<action name="login" class="com.test.action.LoginAction">
				<result name="success">/result.jsp</result>
			</action>
		</package>

</struts>

最后,完成我们还缺少的一环,处理客户信息,新建一个result.jsp:

 <body>
    username: ${requestScope.username }<br/>
    password: ${requestScope.password }
  </body>

重启Tomcat,访问:http://localhost:8080/struts2/login.jsp,输入zhangsan,12345,跳转到http://localhost:8080/struts2/login.action?username=zhangsan&password=12345,并且显示username和password信息,即为成功。这种Get提交方式不太安全,因此可以把表单的提交该为post方式。

学习内容:

  • Struts2入门及基本配置
  • Struts2核心概念及原理
  • Struts2类型转换
  • Struts2输入校验
  • Struts2实现文件上传及下载
  • Struts2深入探索(源代码)
  • Struts2的拦截器(Intercepter)
  • Struts2的国际化(Internationalization)
  • Struts2标签库

Struts2是什么?

  Struts2 = Struts + WebWork

为何Struts2使用XWork?

  XWork是一个通用命令模式的框架,WebWork = WebWork Core + XWork,Struts2 = Struts 2 Core + XWork。Struts2把Web功能转换提供给XWork。

XWork提供了什么?

  实现独立运行的命令模式框架:Action作为命令对象存在于XWork中

  增加了高级功能

    拦截器:包括设置表单参数,处理文件上传等

    结果(Result):包括多个Action之间的链接,转向表示层

    简单的IoC(或称DI,依赖注入)容器,可给Action对象注入值(Spring)

    强大的对象查询语言-OGNL

    自动类型转换

    元数据驱动的验证框架

    插件机制

Struts Core提供了什么?

  • 封装HTTP请求/响应对象为Map
  • 处理Session/Application范围
  • ServletDispatcher转换HTTP请求执行Action
  • 提供了Web层的拦截器
  • 将Result转换为具体的redirect&dispatch,或者其它表示层

系统架构:

  • 接收到请求
  • FilterDispatcher找到合适的Action
  • 拦截器调用
  • Action中的方法执行("核心"业务)
  • Result进行输出

Action:

  Action是命令对象;Action应尽量简单;Action和任何Web对象无关;Action接口只有一个方法:

public interface Action
{
    public String execute() throws Exception;
}

需要注意的一点:Struts2下载包内不包含XWork源码,如有需要需从XWork网站下载。

Struts2基本开发配置(完成Struts2 Hello Workd):

  • 启动MyEclipse
  • 创建Web Project
  • 添加必需的Struts2 jar文件
  • 向web.xml加入struts2过滤器
  • 创建Action类HelloWorldAction
  • 创建JSP表示层页面HelloWorld.jsp
  • 创建struts.xml并加入action定义
  • 运行测试

  执行流程为:action->FilterDispatcher->HelloWorldAction.execute()->"success"->struts.xml找到Result->显示HelloWorld.jsp

  看不到的过程-拦截器:设置表单参数;设置请求属性

开发简单登录应用:

  • 编写表单页面login.jsp
  • 编写登录结果页面login_result.jsp
  • 编写Action类UserAction
  • 给struts.xml加入Action定义
  • 运行测试
  • 执行流程
  • 改进:登录失败返回输入页面

Struts2和1的异同点

  不同点:FormBean被Action属性取代;ActionForWard被Result取代;Action类中不直接出现Servlet对象;引入了package的概念;引入了拦截器的概念;Struts2的开发大大简化

  相同点:都是MVC架构;均提供了控制器和流程跳转功能;监听特定的URL地址来实现功能.action;均提供了切换view层的功能;提供了类似的标签库:表单和逻辑;都支持国际化功能

补充:package与action的关系,就好像Java中的包和类的关系一样,一个package可以包含多个action,Java中的包是有名字的,struts也是如此,这个名字是可以随意起的,此外,struts中的包还允许继承,如我们的struts.xml中,extends="struts-default",在MyEclipse中打开Struts2-core-2.1.6.jar,可以看到里面有一个struts-default.xml的文件, 可以看到他的包<package name="struts-default" abstract="true">,因此我们的struts.xml继承了这个名字为struts-default的包,具有了该包定义的所有功能,abstract为true表示该包为抽象包,不能直接用,我们自己写的struts就是一个具体的包。

下面我们用struts标签库来写一个login2.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP ‘login2.jsp‘ starting page</title>

	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>

  <body>
   	<s:form action="login.action">
   		<s:textfield name="username" label="username"></s:textfield><br/>
   		<s:password name="password" label="password"></s:password>
   		<s:submit value="submit"></s:submit>
   	</s:form>
  </body>
</html>

注意<%@ taglib uri="/struts-tags" prefix="s" %>和body中的内容是我们自己添加的。此外我们可以按住Ctrl键,鼠标点击,跟进其源代码,在<s:textfield...这一行,跟进去发现一个8000多行的tld(struts-tags.tld)文件,其<uri>/struts-tags</uri>,此即我们的taglib的uri的来源。

此外,还用注意的一点,标准的HTML表单默认提交方法是Get,而Struts2的表单默认的提交方式是Post。还有,表单中的.action可以省略,它是struts2默认的后缀名。

时间: 2024-08-26 03:29:12

第十部分_Struts2.1详述与MVC设计模式的相关文章

Gradle 1.12 翻译——第十五章. 任务详述

有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html 本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41038305 关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qin

iOS-MVC设计模式

MVC的设计模式就本质就时把类的功能进行分类设计,斯坦福大学的老头子在iOS课程中说过,View不关心数据实体,view通过代理通知Controller自己被操作了,让Controller来决定程序的运行,如逻辑跳转或者页面跳转:Model不关心UI,Model负责数据实体的管理如从网络上获取数据实体,一般设计为单例模式,对数据实体的增加删除修改,而这些操作Model通过通知中心通知Controller,Controller通过监听对应的通知来调用对应的操作方法来在主线程更新UI.View和Mo

python mvc设计模式(一)

一.代码组织(目录结构) 二.mvc概述 MVC设计模式即MVC框架. MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑和数据显式分离的方法组织代码,将业务逻辑被聚集到一个部件里面,在界面和用户围绕数据的交互能被改进和个性化定制的同时而不需要重新编写业务逻辑.MVC被独特的发展起来用于映射传统的输入.处理和输出功能在一个逻辑的图形化用户界面的结构中. 三.代码 1.数据 #cod

Java Web开发中MVC设计模式简介

一.有关Java Web与MVC设计模式 学习过基本Java Web开发的人都已经了解了如何编写基本的Servlet,如何编写jsp及如何更新浏览器中显示的内容.但是我们之前自己编写的应用一般存在无条理性,对于一个小型的网站这样的编写没有任何问题,但是一但我们需要编写大型的web工程的话,我们现有的编写模式会造成web应用的可扩展性较差,而且一但出现问题不能准确的定位出问题出在哪里. Java是一门应用设计模式比较广泛的语言.目前主流提出的23种设计模式均可在Java语言编写的程序中所应用.目前

转---MVC设计模式详解

MVC(Model View Controller)模型(model)-视图(view)-控制器(controller):MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如一批统计数据你可以分别用柱状图.饼图来表示.C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,从例子可以看出MVC就是Observer设计模式的一个特例.MVC如何工作MVC是一个设计模式,它强制性

【原创翻译】认识MVC设计模式:web应用开放的基础(基础篇)

原文地址:http://www.larryullman.com/2009/10/08/understanding-mvc/ 翻译:shadowmydx 转帖请注明 最近,我计划写一个系列关于自己在过去几个月使用的Yii框架(shadowmydx:基于PHP5的一个web开发 框架,详情自行google)的文章.但在一切开始以前,我认为首先还是需要先介绍一下MVC设计模式: 模型-视图-控制器.MVC模式(30年前就有鸟)已经成为了框架以及许多各式各样的应用的首选.MVC模 式主要着眼于分离应用的

MVC设计模式在网站中的应用

MVC设计模式在网站中的应用 以淘宝的购物车为例 一.结合六个基本质量属性 可修改性 采用MVC设计模式的时候,可以将视图.模型.控制器分析,将用户动作.数据表示.应用数据分离开来,如果用户需要以不同的视图来展示,只需要修改视图中的代码即可,对于模型和控制器的代码,则不需要做改动,即可满足要求,使得对代码的修改非常方便. 易用性 用户可以直接在商品展示界面中将商品添加进购物车,直接点开购物车就可以看到已经添加的商品:删除某一件商品时,也可以直接在商品的后面点击删除,确认之后,即可删除. 安全性

如何理解MVC设计模式

MVC是一种架构模式 MVC(Model View Controller) M-模型(model) V-视图(view) C-控制器(controller): MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器.使用MVC是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式.比如一批统计数据你可以分别用柱状图.饼图来表示.C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,从例子可以看出MVC就是Observer设计模式的一个特例. MV

ASP.NET下MVC设计模式的实现

[转载]MVC架构在Asp.net中的应用和实现 转载自:http://www.cnblogs.com/baiye7223725/archive/2007/06/07/775390.aspx 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能为Web应用带来的好处.并以“成都市信息化资产管理系统”框架设计为例,详细介绍其在Asp.net环境下的具体实现.旨在帮助Web设计开发者更好的了解和掌握MVC,合理利用MVC构建优秀的Web应用. 关键字:MVC.视图.控制器.模型.Asp.net