Struts的Model-2 MVC策略

Spring MVC面试系列-01 Spring MVC属于Spring FrameWork的后续产品,已经融合在Spring Web Flow中。Spring框架提供了构建Web应用程序的全功能MVC模块。使用Spring可插入MVC架构,从而在使用Spring进行WEB开发时,可以选择使用Spring中的Spring MVC框架或集成其他MVC开发框架,如Struts1(已基本淘汰),Struts2(老项目还在使用或已重构)等。 阅读详情

 

Struts是特别为基于Web的应用而设计的,因此它自然采用了流行的Model-2 MVC策略,或者说架构。
插图1.5 Struts Model-2
Struts框架对Model、View和Controller有非常明确的定义。当我们进一步考察Struts如何实现MVC的这三个支柱时,你还将看到它们是如何被很好分离的(这是MVC模式一个主要的好处)。你可能已经注意到,Struts更多的是一个应用框架,而不是严谨的UI组件框架。但是它的主要目的,仍然是使用可重用的组件(客户端可能通过它们操作底层的信息或数据)来建立用户界面。
1.3.2.1 Controller
Struts controller的核心是ActionServlet——一个Front Controller servlet。Action- Servlet是对Web应用以及后台控制中心(决定各请求如何处理)访问的唯一接口。它负责接收来自客户端(例如Web浏览器)的HTTP请求,并将它们直接派发到另一个Web页面,或者
一个合适的处理器(handler),由后者最终提供响应。
Struts中的处理器就是Action,其本质是一个Command模式的JavaBean。它负责检查请求中的信息,执行一些操作,也可能填装一些表示组件将要使用的数据,然后同ActionServlet通信,决定下一步将控制转发到何处。一个常见Action的例子就是LoginAction,通过调用在Model层中对业务对象的操作,尝试让用户登录系统。如果尝试成功,控制将可能被转到JavaServer页面(JSP)来显示该用户的主页;否则,控制可能被转发回原先的登录JSP,并提供进一步的指导。
此时你可能奇怪,ActionServlet是如何判断将请求派发往何处呢?有个解决方法是在ActionServlet本身内部硬性编写判断点,不过这差不多立即就会引发维护问题。Struts通过提供一个外部的XML(Extensible Markup Language,可扩展标记语言)配置文件,通常名为struts-config.xml来解决这个设计问题。该文件定义了请求的URL到Action类之间的映射关系,以及其它一些内容。这种映射在Struts中叫作ActionMapping。当Web应用启动之后,ActionServlet读取该配置文件,将它的内容保存在内存中,之后当客户端的每个请求到达时,访问该信息。清单1.1是这个文件的简单示例。
<?xml version="1.0"?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd" >
<struts-config>
    <form-beans>
        <form-bean name="loginForm" type="login.LoginForm"/>
    </form-beans>
    <action-mappings>
        <action name="loginForm"
            path="/login"
            scope="request"
            type="login.LoginAction">
            <forward name="success" path="/success.jsp"/>
            <forward name="failure" path="/failure.jsp"/>
        </action>
    </action-mappings>
</struts-config>
清单1.1 Struts配置文件示例
这个特例配置文件为用户登录定义了一个映射。不管何时,只要接收到的请求以/login结尾,ActionServlet将会把控制转发到LoginAction。
此时你可能还想知道,在Action完成任务后,它是如何指示ActionServlet将控制派发到哪儿呢?你可以在action中硬性编码,不过这将使它们很难重用与维护。注意到在配置文件中有两个转发标记,分别叫作success和failure。LoginAction在运行时可以访问ActionMapping,并可以在将控制交还给ActionServlet时,使用这些逻辑名而非物理路径。改变路径只需要在配置文件中进行一处改动,而不需要改动action。
清单1.2提供了这个简单Action——LoginAction——的源代码,来一探究竟。为简单起见,这个Action并不包括国际化以及日志的代码。
public final class LoginAction extends Action {
    public ActionForward execute(ActionMapping mapping,
                                  ActionForm form,
                                 HttpServletRequest request,
                                 HttpServletResponse response)
        throws Exception {
        User user = null;
        // Extract user information from request
        String userName = (String)
                PropertyUtils.getSimpleProperty(form, "username");
        String password = (String)
                PropertyUtils.getSimpleProperty(form, "password");
        // Access the Login business object.
        UserSecurityService security = new UserSecurityService();
        // Attempt to log in.
        user = service.login(userName, password);
        // If no such user exists, display error page
        if(user == null) {
            return mapping.findForward("failure");
        }
        // Create a new session for this user.
        HttpSession session = request.getSession();
        session.setAttribute(Constants.USER_KEY, user);
       
        // The user exists and has successfully logged in.
清单1.2 简单的登录Action(待续)
        // Display the success page.
        return mapping.findForward(“success”);
    }
}
清单1.2 (续)
从这个示例中,你可以看到如何访问业务对象,以及Action如何告诉ActionServlet下一步将控制转发到哪里。这里是到Model层的一个清晰界限。甚至在Controller层的页面流(page flow)也被解耦——因为使用了逻辑名转发,而不是硬性编码的路径。
1.3.2.2 Model
Model包括了应用的业务对象所描绘的领域模型(domain model),它并不是由Struts框架明确要求或强制的。这些业务对象通常要么表现为企业级JavaBean(EJB)、Java数据对象(JDO或及其它类似Hibernate的ORM框架),要么表现为像DAO模式所描述的那样,通过JDBC访问数据库的朴素JavaBean。Struts的Controller在Struts的Action对象内同Model发生联系。如前所述,Action通常会调用对业务对象的操作来达到目的。
注意:
对于许多刚刚接触Struts、经验缺乏的开发者来说,常犯的一个错误是把业务逻辑放在他们的Action对象中。这么做的缺陷是,抹杀了Struts的Controller同Model之间的界限,应该避免。清单1.2给出了一个很好的例子,说明了Action应该如何同业务层交互。
1.3.2.3 View
Struts中的View层一般由包含自定义标记的JSP页面构成。Struts框架提供了许多框架可识别的自定义标记库。这些标记库中有一个叫Tiles,它允许你通过可重用的JSP模板来组合View。这个标记库将在下一节讨论。
继续我们的登录示例,登录的JSP页面如清单1.3所示。
<%@ page contentType=”text/html;charset=UTF-8” language=”java” %>
<%@ taglib uri=”/WEB-INF/struts-html.tld” prefix=”html” %>
<%@ taglib uri=”/WEB-INF/struts-bean.tld” prefix=”bean” %>
<html:html>
   <head>
        <title><bean:message key="app.title"/></title>
    </head>
    <body>
        Log on with your username and password.<br/><br/>
        <html:errors/>
        <html:form action="/login">
            Username: <html:text property="username"/><br/>
            Password: <html:password property="password"/><br/>
            <html:submit value="Login"/>
        </html:form>
    </body>
</html:html>
清单1.3 登录的JSP页面示例
迄今为止,我们还没有涉及数据如何来往于JSP之类的表示组件。Struts通过ActionForm来完成传递,后者本质上就是一个JavaBean,有若干合适的property。你可以将它看作是View数据对象。作为登录示例的一部分,清单1.4给出了LoginForm的代码。
public final class LoginForm extends ActionForm {
    private String password;
    private String username;
    /**
     * Provides the password
     */
    public String getPassword() {
        return (this.password);
    }
    /**
     * Sets the desired password
     */
    public void setPassword(String password) {
        this.password = password;
清单1.4 登录示例的LoginForm(待续)
}
    /**
     * Provides the username
     */
    public String getUsername() {
        return (this.username);
    }
    /**
     * Sets the desired username
     */
    public void setUsername(String username) {
        this.username = username;
    }
    /**
     * Resets all properties to their default values
     */
    public void reset(ActionMapping mapping,
                      HttpServletRequest request) {
        password = null;
        username = null;
    }
   /**
     * Validate the properties that have been set.
     */
    public ActionErrors validate(ActionMapping mapping,
                                 HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        if ((username == null) || (username.length() < 1))
            errors.add(
                    “username”,
                  new ActionError(“Username Is required.”)
             );
        if ((password == null) || (password.length() < 1))
            errors.add(
                     “password”,
                  new ActionError(“Password Is required.”)
        );
        return errors;
    }
}
清单1.4 (续)
如清单1.3展示的那样,我们使用Struts的HTML标记库来为登录提供输入参数。当ActionServlet从该页面收到请求时,会尝试把这些参数装填入一个LoginForm对象中。我们已经提供的validate()方法将被ActionServlet调用。如果报告有错误,页面会被重新载入并显示错误信息;如果一切正常,ActionServlet将会把控制转到LoginAction(正如清单1.1中的action映射部分所指定的那样)。LoginAction将访问LoginForm,如清单1.2所示。而且在清单1.1的form-bean中作了指定。
注意:
如果从应用的立场考察Struts框架,ActionForm不是Model层的一部分。它实际上是Model的一个快照,稍后用来在View层中渲染响应。因此,ActionForm在Struts中可以认为是View层的一部分,如插图1.5演示的那样。
回答了如何从请求中取得数据给Action,但是如何从Action得到数据,提供给最终的表示组件渲染响应呢?因为每个Action都可以访问ActionServlet的响应对象,它可以随意在请求或会话范围内放置任何信息,之后被某个JSP页面所使用。JSP不知道或者不关心数据从何而来,这为Controller和View层之间提供了很好的分隔。
 
基于MVC模式的客户关系管理系统设计与实现 CRM系统为企业提供了一个集中化的平台,使公司能够存储和管理客户信息,记录与客户的互动历史,分析客户行为模式,并制定针对性的营销策略。它有助于增强客户体验,从而提高客户的满意度和忠诚度。MVC(Model-View-Controller)是一种软件设计模式,被广泛用于Web开发和许多其他类型的用户界面应用程序开发中。MVC模式将应用程序分为三个核心组件:Model(模型):负责管理应用程序的数据逻辑。它处理所有的业务逻辑和数据访问逻辑,通常与数据库交互,并且能够处理事务。 阅读详情

相关推荐

Java MVC项目实战:增删改查应用系统

本文还有配套的精品资源,点击获取 简介:本Java项目采用了MVC设计模式,集成了Java语言的特性和数据库技术,提供了一个包含数据增删改查功能的业务处理系统。Model层负责数据管理与业务逻辑,View层展示数据并接收用户输入,而Controller层作为二者间的桥梁,处理用户请求并更新视图。项目使用了Struts框架实现前端与后端的通信,且涉及了关系型数据库的交互。整体...

weixin_42509513的博客 1288

Struts如何实现Model 2, MVC, 和层

      Struts 通过提供一个控制器Servlet 实现了Sun 的 Model 2 架构,这个控制器可以用来管理JSP 页面和其他表现设备之间的流程。Struts 通过使用ActionForward和ActionMapping来保证表现层之外的控制流决策来实现 MVC/层 模式。JSP 可以引用一个逻辑目标。控制器组件在运行是提供准确的URI。      表列出了Struts 的核心类,...

言程序 210

JavaEE struts表单和ModelDriver以及主题

JavaEE struts表单和ModelDriver以及主题

Struts 框架之构建 Model组件

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 644

EDA环境下的LSF进阶调优:如何为Cadence/VCS等工具正确配置cgroups与daemon starter

本文深入探讨了在EDA环境中如何为Cadence/VCS等工具正确配置LSF的cgroups与daemon starter,解决资源分配与特殊应用兼容性问题。通过详细解析cgroups技术、daemon starter配置及混合资源管理策略,帮助提升LSF集群的效率和稳定性,特别适用于高性能计算和芯片设计场景。

weixin_33724046的博客 461

UFS 功能描述:UFS boot

UFS 启动过程介绍:启动配置,启动代码下载过程和安全性

m0_51720747的博客 1601

四、struts学习之model接收参数和提示错误信息对象

1.jsp相关代码 2.建立相关model类 public class Student { private String name; private String password; public String getName() { return name; } public void setName(String name) { this.na

空灵的专栏 490

高通camera:PDAF的配置与测试

确认相关log日志都已经打开了之后,判断是在3A算法中没有应用到PDAF,可能是之前在调试AF效果的时候关闭了PDAF,打开效果文件对应的文件夹,在\kamorta_lce_S5K3P9\Scenario.Default\XML\STATS。在log中搜索af_pdaf_proc_pd_single,这个函数是pdaf算法中的,源码被封装了,这里看不到,因此只能通过log打印出来的参数来分析pd是否正确,主要参数有pd ,defocus,confidence。PDAF的配置与测试。

arvin_xiong的博客 2485

struts2 model

struts2 如果模型驱动与属性驱动有相同的字段  模型驱动优先  笔记

慢行者的专栏 772

HC32F460的GPIO重映射实战:如何用3步搞定SPI引脚冲突问题

本文详细介绍了HC32F460的GPIO重映射功能,通过三步操作解决SPI引脚冲突问题。文章解析了HC32F460的FuncGroup功能分组机制,提供了具体的寄存器配置步骤和验证技巧,并对比了与传统方案的性能优势,帮助工程师灵活配置引脚,优化硬件设计。

t4y5u6i7o的博客 918

基于一维卷积神经网络对机械振动信号进行分类并加以预测

基于一维卷积神经网络对机械振动信号进行分类并加以预测 *使用一维卷积神经网络训练振动信号进行二分类 2020年7月16日,一学期没等到开学,然而又放假了。 总览优快云中大多数卷积神经网络都是对二维图片进行分类的,而图片也都是常见的猫狗分类,minst手写数字分类。一维卷积神经网络的使用非常少见,有也是IDMB情感分类,和鸢尾花分类的。 作者研究生就读于河北一所双飞,全国排名270多,哈哈哈,不吹不黑。 在网上翻来翻去找不到一篇可以利用的代码去研究我的机械故障诊断,后来在无奈下到某宝搜寻到一段代码,可以利用

qq_45714906的博客 1万+

Struts2域模型(DomainModel)的使用

1.public class UserAction extends ActionSupport { 2. 3. //域模型的使用 4. private User user; 5. public User getUser() { 6. return user; 7. } 8. public void setUser(User user) { 9. this.user

Joker_Fei的博客 1821

ROS新手必看:如何用URDF快速搭建UR5机械臂模型(附完整代码)

本文为ROS新手提供了一份详细的UR5机械臂URDF建模实战指南。通过解析URDF核心概念,逐步讲解如何定义link与joint,并整合官方网格文件,最终构建出完整的、可在RViz中可视化与控制的UR5模型。文章还介绍了模型验证、调试技巧以及如何添加碰撞与惯性属性,为后续的物理仿真与算法开发奠定坚实基础。

pz89012345的博客 498

jsp springmvc 视图解析器_Spring MVC 面经

1 什么是 Spring MVC?Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 web 层进行职责解耦,把复杂的 web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合2 什么是 MVC 模型?用户的请求会到达 Servlet,然后根据请求...

weixin_32946543的博客 337

正点原子RK3588 Android 12镜像构建实战:从环境配置到烧录验证全指南

本文提供了一份基于正点原子RK3588开发板的Android 12镜像构建全流程实战指南。内容涵盖从Ubuntu环境配置、SDK获取、编译内核与系统,到最终镜像打包与烧录验证的完整步骤,并分享了内核驱动定制与系统优化技巧,旨在帮助开发者高效完成瑞芯微RK3588平台的系统定制工作。

grass的博客 810

WordPress插件depicter存在SQL注入漏洞(CVE-2025-2011)

Depicter 是一款功能强大的 WordPress 幻灯片插件,允许用户通过直观的拖放编辑器轻松创建响应式滑块、轮播和动态内容展示。该插件提供丰富的模板库、动画效果和图层控制,支持多媒体内容嵌入(如图片、视频、HTML),并优化了移动端显示和SEO性能。其无代码操作界面适合非技术用户,同时提供高级自定义选项,适用于产品展示、营销推广和视觉叙事等多种场景,是提升网站视觉吸引力的高效工具。

m0_50125527的博客 550

利用java反射模拟struts2工作(二)

继[url=http://z276356445t.iteye.com/blog/1051368]上一篇[/url]文章模拟struts2的工作机制,上一篇主要是对配置文件的编写以及解析,接着是使用servlet来控制对action的访问以及result返回的处理。由servlet来充当Control层,首先来看一下web.xml的配置。 [code="java"] baseS...

没有比脚更长的路,没有比人更高的山 139

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Struts 2 学习总结

1. Web技术的发展 静态页面->CGI开创动态执行Web应用时代->Servlet技术->Model 1 JSP(JSP兼具View和Controller角色)->Model 2 JSP Model1 JSP页面兼具View和Controller两种角色,控制逻辑和表现逻辑混合在一起,导致代...

depe16540458的博客 250

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

JSP 架構介紹 - Model1 , Model2 , and Model2x [精華]

JSP 架構介紹 - Model1 , Model2 , and Model2x [精華] Chapter 1 Model 1 , 透過 JSP 來接值1.1 什麼是 Model 1 的 JSP 架構如圖有三種情況是大家最常使用到的(1) A.jsp, 例如 Hello xxx 的程式, 將程式碼全部寫在 jsp 檔案之中(2) B.jsp, 把部分的商業邏輯抽出來, 放在 JavaBean 中,

2070

MVC思想及其优势

《Struts 2.1权威指南》第1章Struts 2概述,本章大致介绍了Web应用的开发历史,从历史的角度介绍了Model 1和Model 2的简要模型和特征,进而介绍了MVC模式的主要策略和主要优势。本节为大家介绍MVC思想及其优势。 1.1.2  Model 1和Model 2 对于Java阵营的动态Web编程技术而言,则经历了所谓的Model 1和Model 2时代。

远有青山 8185

Spring MVC 面经

1 什么是 Spring MVC? Spring MVC 是一个基于 Java 的实现了 MVC 设计模式的请求驱动类型的轻量级 Web 框架,通过把 Model,View,Controller 分离,将 web 层进行职责解耦,把复杂的 web 应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合 2 什么是 MVC 模型? 用户的请求会到达 Servlet,然后根据请求调...

Geffin的博客 846

MVC模式和Struts模式的理解

MVC方式通常在Smalltalk中用于建立用户接口。通过对MVC中蕴藏的设计模式可以帮你理解我们所说的“模式”的含义。 MVC包括三类对象,Model是应用对象、View为其屏幕表示、Controller定义了对用户输入的处理(反应)方式。在应用MVC方式以前,通常将这三个对象的功能合到了一起,应用MVC分离了它们,为设计提供了灵活性和可重用性。 MVC通过在view和model之间建立S...

systemxgl的专栏 368

spring的优点以及和Struts的区别

什么是Spring MVC,以及其优点 一个基于MVC(model,view,controller)模式的web开发架构。可以将model,view,controller分离为逻辑清晰的几部分,简化开发流程。 易于扩展,视图技术灵活(JSP/FTL),支持各种请求资源的映射策略。 springMVC和struts2的区别有哪些? (1)springmvc的入口是一个servlet即前端控制...

qq_38331606的博客 413

MVC框架

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用于组织代码用一种业务逻辑和数据显示分离的方法,这个方法的假设前提是如果业务逻辑被聚集到一个部件里面,而且界面和用户围绕数据的交互能被改进和个性化定制而不需要重新编写业务逻辑MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个逻...

abo38416的博客 284

Struts不能完全用MVC来理解

刚才有一个关于Struts和MVC组件对应关系的帖子,现在好像被放入了新手区,关于这个问题记得以前有过激烈的讨论,可惜刚才我搜索一下没有找到想找的那篇,希望有谁找到能把链接发上来 对于这个问题我觉得还是有讨论的一些必要,因为疑惑的人还是存在,而且从我个人来说对这个问题的理解也在不断的变化。现在把我现在的理解写下来,可能存在偏颇(本来理解也在变化),只供讨论 我现在的观点是: MVC可...

qinysong的专栏 176

Struts/Spring/Hibernate三大开源框架底层机制以及原理

Struts1的工作原理Struts1工作原理图:1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时...

桔子先生 1037
下一篇: 【转】程序员的爱情表白
韬哥的私房菜
博客等级 码龄18年 12粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值