当前位置: 首页 > news >正文

通过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开发的一些优点,仅供参考:

  1. 通过简单、集中的配置来调度动作类,使得配置和修改都非常容易。
  2. 提供简单、统一的表达式语言来访问所有可访问的数据。
  3. 提供内存方式的数据中心,所有可访问的数据都集中在存放在内存中,所以在调用中不需要将数据传来传去,只需要去内存数据中心访问即可。
  4. Struts2提供标准的、强大的验证框架和国际化框架,而且与Struts2的其他特性紧密结合。
  5. 强大的标签库,使用标签库可以有效的减少页面代码。
  6. 良好的Ajax支持。增加了有效的、灵活的Ajax标签,就像普通的标准Struts2标签一样。
  7. 简单的插件。只需要简单的放入一个jar包 ,任何人都可以扩展Struts2框架,而不需要什么特殊的配置。这使得Struts2不是再是一个封闭的框架,任何人都可以为其添砖加瓦,可以通过实现Struts2的某些特殊的可扩展点,比如自定义拦截器、自定义结果类型、自定义标签等,来为Sturts2定制需要的功能,而且还可以快速的发布给别人使用,就像Eclipse的插件机制一样,简单易用。
  8. 明确的错误报告,Struts2的异常简单而明了,直接指出错误的地方。
  9. 智能的默认设置,不需要程序员另外进行繁琐的设置。很多框架对象都有一个默认的值,不用再进行设置,使用其默认设置就可以完成大多数程序开发所需要的功能。
参考链接:https://blog.csdn.net/li_qinging/article/details/72809789


未完待续.......








转载于:https://www.cnblogs.com/kevinWu7/p/10163489.html

相关文章:

  • 酒店管理系统
  • 前端人工智能?TensorFlow.js 学会游戏通关
  • 从 源码 谈谈 redux compose
  • 【译】理解JavaScript:new 关键字
  • 开发者论坛一周精粹(第四十三期) 物联网全栈教程 ECSphp版本降级
  • Waymo宣布今年在凤凰城推出自动驾驶汽车打车服务,此前已获得商业执照
  • 数学随记—公式定理
  • docker操作使用
  • 【枚举】【贪心】Codeforces Round #482 (Div. 2) B. Treasure Hunt
  • Python学习笔记__6.3章 继承和多态
  • 如何高效的编写与同步博客 (.NET Core 小工具实现)
  • Mongodb对集合(表)和数据的CRUD操作
  • (2)Java 简介
  • innobackupex 在增量的基础上增量备份
  • elasticsearch+logstash+kibana+redis
  • 《深入 React 技术栈》
  • AHK 中 = 和 == 等比较运算符的用法
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • golang中接口赋值与方法集
  • Vue.js-Day01
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 阿里研究院入选中国企业智库系统影响力榜
  • 从setTimeout-setInterval看JS线程
  • 二维平面内的碰撞检测【一】
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 计算机常识 - 收藏集 - 掘金
  • 如何胜任知名企业的商业数据分析师?
  • 手写双向链表LinkedList的几个常用功能
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • Java总结 - String - 这篇请使劲喷我
  • 阿里云服务器购买完整流程
  • ​Linux·i2c驱动架构​
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • # centos7下FFmpeg环境部署记录
  • #1015 : KMP算法
  • #define
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (二)springcloud实战之config配置中心
  • (论文阅读11/100)Fast R-CNN
  • (三分钟)速览传统边缘检测算子
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)socket Aio demo
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .net 中viewstate的原理和使用
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET开发不可不知、不可不用的辅助类(三)(报表导出---终结版)
  • .NET连接MongoDB数据库实例教程
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .Net中间语言BeforeFieldInit