通过Struts2Web应用框架深入理解MVC
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet.
一.用法简介:
1.Eclipse新建Dynamic Web Project, 项目名:Struts2Pro
2.Apache官网http://struts.apache.org/下载 struts-2.5.16-min-lib
3.把 struts-2.5.16-min-lib解压后的jar文件拷贝到WEB-INF的lib目录下
4.配置web.xml
<filter>
<filter-name>struts_filter</filter-name>
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts_filter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
这个配置是和配置servlet是一样的意思,就是当url中有满足.action的格式时,自动转到
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter这个类中去处理,
而这个类就在上面拷贝进去的jar文件中. struts_filter时自己定义,不要重名即可
5.添加一个struts.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">
<struts>
<package name="main" extends="struts-default">
<action name="Example" class="my.ExampleAction">
<result name="success">/Result_Example.jsp</result>
</action>
</package>
</struts>
主要是action这个节点,当发现为Example时,会调用my下的ExampleAction类去处理
然后result是绑定“success”到Result_Example.jsp
6.添加ExampleAction.java类:
package my;
import com.opensymphony.xwork2.ActionSupport;
public class ExampleAction extends ActionSupport
{
private static final long serialVersionUID = 1L;
@Override
public String execute() throws Exception
{
// TODO Auto-generated method stub
name="zhiduanqiangchang";
phone="18357302156";
return "success";
}
int id;
String name;
String phone;
public int getId()
{
return id;
}
public void setId(int id)
{
this.id = id;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getPhone()
{
return phone;
}
public void setPhone(String phone)
{
this.phone = phone;
}
}
最关键的是该类继承了ActionSupport类,然后重载了execute方法
然后自定义了三个属性,id, name, phone
7.添加Result_Example.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
ID:<s:property value="id"/> <br/>
姓名:<s:property value="name"/><br/>
手机号:<s:property value="phone"/><br/>
</body>
</html>
其中<%@ taglib prefix="s" uri="/struts-tags" %> 是导入struts2 标签库 加了这个后就可以 使用 struts2标签了
所有 s:开头的标签都会被struts2框架解析
8.启动tomcat,浏览器访问 :
http://localhost:8080/Struts2Pro/Example.action?id=111111
结果如图所示:
好,至此一个Struts2的基本框架已经搭建完毕,让我们捋一捋是Struts2是如何实现的
1.首先,当我们访问http://localhost:8080/Struts2Pro/Example.action?id=111111该地址时,发送请求给tomcat服务器
2.但是先被web.xml中定义的Filter拦截了下来,因为url中有.action这样的格式,
3.然后调用了org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter这个类去处理请求,这个类是struts内部实现的
4.然后StrutsPrepareAndExecuteFilter类去寻找struts.xml文件并加载其中的参数,并构建了一个<action_name,class>的映射表,其中就有<Example,ExampleAction> ,还有result映射表<success,Result_Example.jsp>
5.发现url中存在Example,然后运用映射表,调用ExampleAction去处理
6.然后运用反射技术,构造my.ExampleAction,并调用其中的重载函数execute
7.execute执行完,给id,name,phone属性赋值,返回success
8.然后根据result映射表<success,Result_Example.jsp>,实际上返回了Result_Example.jsp
8.解析jsp代码,替换里面的标签为响应的值,将处理后的Result_Example.jsp页面内容返回给浏览器
二.Struts2的标签:
上例中有s:propety,其实struts中还有很多标签,比如s:if
把Example.jsp改成
</head>
<body>
ID:<s:property value="id"/> <br/>
姓名:<s:property value="name"/><br/>
手机号:<s:property value="phone"/><br/>
<s:if test="id > 100">
id大于100
</s:if>
<s:elseif test="id<100">
id小于100
</s:elseif>
</body>
</html>
其中test中的“id>100”代表条件,框架会去判断id,也就是ExampleAction中的id属性是否大于100,然后输出对应的结果
三.从struts2理解MVC原理
在Struts2,模型层对应业务逻辑组件,它通常用于实现业务逻辑及与底层数据库的交互等。视图层对应视图组件,通常是值指JSP页面。但也适用于其他视图技术。如Velocity或者Excel文档。控制层对应系统核心控制器和业务逻辑控制器。系统核心控制器为Struts2框架提供的FilterDispatcher,它是一个起过滤器作用的类,能根据请求自动调用相应的Action。
由此,可以看到Struts2和MVC是相对应的,Struts2中的FilterDispatcher对应着MVC中的控制层,Action对应着模型层,产生的结果Result对应视图层。
- FilterDispatcher(StrutsPrepareAndExecuteFilter)-------控制层 C
对控制层C来说, 在输入端,FilterDispatcher会根据URL和struts.xml中的配置,来调用对应的Action,在输出端,也是通过返回“success”类似的字符串,来调用对应的结果,既输入输出全部可配置,控制全在核心的struts.xml中,
控制层不需要关心具体的逻辑处理和视图处理,只需要关心输入什么->调用对应的Action,和输出什么->调用对应的Result,而这就是MVC的核心思想
FilterDispatcher其实是一个过滤器Filter(Servlet规范中的一种Web组件),它是Struts2核心包里已经做好的类,不需要程序员去开发,是需要在项目的web.xml文件中配置一下即可。FilterDispatcher体现了J2EE核心设计模式中的前端控制器模式。
- Action--------模型层 M
Action负责把请求中的参数组装成合适的参数模型,并调用相应的业务逻辑进行真正的功能处理,然后产生下一个视图展示所需要的数据。最后得到下一个视图所需要的信息,并传递给控制层中的拦截器链。
- Result--------视图层 V
视图层主要用来与用户交互,它将从控制层得到的数据通过适合的展示方式展现给用户,让用户与之交互更加简洁简单。在Struts2中,除了大众熟知的JSP方式,还有freemarker、velocity等各种优秀的展示方式。
总之,Struts2框架实现了MVC的设计思想,使得系统各组件之间的偶和降低,提高了程序的高度扩展性和可维护性。
Struts2的开发优势
Struts2是对MVC思想的具体实现,具有非常好的开发优势,它较低的软件开发周期以及高可维护性,都深深地吸引了众多的程序开发人员。随着时代的发展,各种开发工具层出不穷,程序开发人员对开发工具的需求也越来越灵活多变。Struts2融合了许多优秀的Web框架的优点,并对缺点进行了改进,使得Struts2在开发过程中具有更大的优势,下面是使用Struts2进行Java Web开发的一些优点,仅供参考:
- 通过简单、集中的配置来调度动作类,使得配置和修改都非常容易。
- 提供简单、统一的表达式语言来访问所有可访问的数据。
- 提供内存方式的数据中心,所有可访问的数据都集中在存放在内存中,所以在调用中不需要将数据传来传去,只需要去内存数据中心访问即可。
- Struts2提供标准的、强大的验证框架和国际化框架,而且与Struts2的其他特性紧密结合。
- 强大的标签库,使用标签库可以有效的减少页面代码。
- 良好的Ajax支持。增加了有效的、灵活的Ajax标签,就像普通的标准Struts2标签一样。
- 简单的插件。只需要简单的放入一个jar包 ,任何人都可以扩展Struts2框架,而不需要什么特殊的配置。这使得Struts2不是再是一个封闭的框架,任何人都可以为其添砖加瓦,可以通过实现Struts2的某些特殊的可扩展点,比如自定义拦截器、自定义结果类型、自定义标签等,来为Sturts2定制需要的功能,而且还可以快速的发布给别人使用,就像Eclipse的插件机制一样,简单易用。
- 明确的错误报告,Struts2的异常简单而明了,直接指出错误的地方。
- 智能的默认设置,不需要程序员另外进行繁琐的设置。很多框架对象都有一个默认的值,不用再进行设置,使用其默认设置就可以完成大多数程序开发所需要的功能。
参考链接:https://blog.csdn.net/li_qinging/article/details/72809789
未完待续.......
通过Struts2Web应用框架深入理解MVC的更多相关文章
- 通过Ruby On Rails 框架来更好的理解MVC框架
通过Ruby On Rails 框架来更好的理解MVC框架 1.背景 因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...
- 其实想要完全理解MVC框架并不是太容易
完全理解MVC并不是很容易.使用MVC需要精心的计划,由于它的内部原理比较复杂,所以需要花费一些时间去思考.同时由于模型和视图要严格的分离,这样也给调试应用程序带来了一定的困难.每个构件在使用之前都需 ...
- 关于对FLASH开发,starling、starling feathers、starling MVC框架的理解
说在前头:楼主之前没有不论什么flash开发经验,仅仅是从一次尝试中总结自己的理解和经验而已.假设有写的不正确的地方,欢迎大家指正. 前一段时间尝试想用flash(as3)又一次制作一下之前做的一个游 ...
- 深入浅出Java三大框架SSH与MVC的设计模式
现在许许多多的初学者和程序员,都在趋之若鹜地学习Web开发的宝典级框架:Struts2,Spring,Hibernate.似乎这些框架成为了一个人是否精通Java,是否会写J2EE程序的唯一事实标准和 ...
- UWP开发之Mvvmlight实践二:Mvvmlight的核心框架MVVM与MVC、MVP的区别(图文详解)
最近UWP开发在海外很潮流,随着微软收购Xamarin,我们这些C#程序员也可以靠这杆小米枪挑战Android,IOS平台了. 那我们为什么选择MVVM做UWP开发?MVC,MVP,MVVM他们之间到 ...
- 【转】深入浅出Java三大框架SSH与MVC的设计模式
原文链接:http://www.cnblogs.com/itao/archive/2011/08/22/2148844.html 在许许多多的初学者和程序员,都在趋之若鹜地学习Web开发的宝典级框架: ...
- 深入理解MVC与MVP
http://www.cnblogs.com/seaky/archive/2011/04/06/1982533.html 在深入分析MVC和MVP之前,我们有必要回顾下经典的三层架构.分层是计算机学科 ...
- [转]JAVA三大框架SSH和MVC
Java—SSH(MVC) JAVA三大框架的各自作用 hibernate是底层基于jdbc的orm(对象关系映射)持久化框架,即:表与类的映射,字段与属性的映射,记录与对象的映射 数据库模型 也就 ...
- <转>ASP.NET学习笔记之理解MVC底层运行机制
ASP.NET MVC架构与实战系列之一:理解MVC底层运行机制 今天,我将开启一个崭新的话题:ASP.NET MVC框架的探讨.首先,我们回顾一下ASP.NET Web Form技术与ASP.NET ...
随机推荐
- Making the Grade
Making the Grade 给定长度为n的序列\(\{a_i\}\),求构造长度为n的递增序列\(\{b_i\}\),求\(\sum_{i=1}^n|a_i-b_i|\)最小值,\(1 ≤ N ...
- ThinkPHP 删除数据
ThinkPHP删除数据使用delete方法,例如: 直线电机价格 $Form = M('Form'); $Form->delete(5); 表示删除主键为5的数据,delete方法可以删除单个 ...
- Http协议之content
用android 通过http协议提交数据至服务器 content的内容 代码如下: private static JSONObject connUpload(String baseUrl, Map& ...
- VS2010-MFC(对话框:创建对话框模板和修改对话框属性)
转自:http://www.jizhuomi.com/software/149.html 对话框,大家应该很熟悉了,在我们常用的软件中大多都有对话框界面,例如,360安全卫士的主界面其实就是个对话框, ...
- 01.visual studio 2017添加菜单
创建项目 文件--新建项目 如果新建项目 左侧没有扩展菜单,请安装即可 添加菜单 右键--添加新项 菜单设置 菜单设置文件: MyCommandPackage.vsct <Buttons> ...
- JVM基础总结
- 《DSP using MATLAB》Problem 8.28
代码: %% ------------------------------------------------------------------------ %% Output Info about ...
- Linux常用技巧
1.解决不能中文显示 xshell 终端语言显示选择UTF-8 #yum groupinstall chinese-support 2.heredocument报错“unexpected end of ...
- springboot思维导图
- linux拆分文件
1.先看下文件总的行数: wc -l filename 我们现在来看看它具体的参数该怎么用: split支持自定义输出文件大小和输出文件行数两种模式,此外还可以定义每一行最大的值. -l 按输出文件行 ...