Struts2技术内幕 读书笔记三 表示层的困惑

表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看。

index.jsp

<form id="form1" name="form1" method="post" action="loginServlet">
<table width="357" border="0" align="center">
    <tr>
      <td width="128">用户名:</td>
      <td width="219"><label>
        <input name="user" type="text" id="user" value="dlf" />
      </label></td>
    </tr>
    <tr>
      <td>生日:</td>
      <td>
        <input name="birthday" type="text" id="pwd" value="2012-05-04" />
      </td>
    </tr>
    <tr>
      <td>
        <input type="submit" name="Submit" value="登录" />
      </td>
    </tr>
</table>
</form>

User.java

public Class User{
    private String user;
    private Date birthday;
    public User(){}
    .....//省略get/set
}

RegisterServlet.java

package example;
public class RegisterServlet extends HttpServlet {
public void destroy() {
   super.destroy(); // Just puts "destroy" string in log

   // Put your code here

}
public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {

   request.setCharacterEncoding("utf-8");      //设置格式
   response.setContentType("text/html");

   PrintWriter out = response.getWriter();     //获得参数
   String name = new String (request.getParameter("user").getBytes("ISO8859_1"), "UTF-8");
   String birthday= new String(request.getParameter("birthday").getBytes("ISO8859_1"), "UTF-8");

   Date date=null;                //参数类型转换
   try{
    date=new SimpleDateFormat("yyyy-MM-dd").parse(birthday);
   }catch(ParseException e){
    e.printStackTrace();
   }  

   User user = new User();                      // 相当于MVC模型图中 第二步create
   user.setName(name);                // 相当于MVC模型图中 第四步extract
   user.setBirthday(date);            // bean中的数据来自于视图

   UserService us=new UserService();            //核心业务逻辑
   us.register(user);
                        //返回处理结果
                        // 相当于MVC模型图中 第三步forward
     request.getRequestDispatcher("/success.jsp").forward(request,response);

}
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        doPost(request,response);
    }
}

web.xml

<servlet>
    <servlet-name>register</servlet-name>        <!--这里是servlet的名字-->
    <servlet-class>example.RegisterServlet</servlet-class>    <!-- 这里写servlet类在的包路径-->
  </servlet>
  <servlet-mapping>                 <!-- 这里是地址映射-->
    <servlet-name>register</servlet-name><!--这个和上面的同名-->
    <url-pattern>/loginServlet</url-pattern><!--这里写servlet映射地址-->
  </servlet-mapping>

我们对照之前的MVC元素

Model(数据模型)----User.java

View(对外交互)-----registration.jsp

Control(程序执行与控制)-----RegistrationServlet.java

URL Mapping(请求转化)----web.xml

上面的代码有问题吗?

没有问题(除了取参数那部分)

上面的代码好吗?

不好。

哪里不好?

不好的地方主要在以下两点:

1 出于程序可读性和可维护性的考虑,程序还需要重构。

2 业务扩展也存在问题。

上面说的问题很宏观也很泛,下面具体说几个问题。

1 当浏览器发送一个Http请求,Web容器是如何接收这个请求并指定相应的java类来执行业务逻辑并返回处理结果呢?

这其实就是一个URL Mapping的问题。

对这个感兴趣的朋友 可以阅读 下面的一篇文章

how tomcat works 读书笔记 十一 StandWrapper 上

http://blog.csdn.net/dlf123321/article/details/41247693

里面的参数由web.xml而来。

其实如何查找对应的java类,说白了就是servlet容器会分析请求的url并且和web.xml里面的servlet-mapping元素下的uri-pattern对照,如果找到一致的,就按照servlet-name查找到相应的java类。

至于这个根据uri生成java对象,在tomcat中使用的是digerter库。相关内容见:

http://blog.csdn.net/dlf123321/article/details/41802443

很简单吧。但是这里也有一个问题,如果一个web.xml里面就写3-5个servlet,我们看着也方便;可问题是,如果一个系统里程序执行与控制部分由几十个几百个,都放在web.xml里面,那就是一场灾难了。

解决这个问题的策略是建立一套由uri到java类的规则匹配引擎。

2 在web请求中,数据是如何顺利地流转与浏览器与java世界中的。我们能否做到自动匹配?

在浏览器中,我们看到的信息都是字符串(弱类型),但是在java中,有string,int,boolean等等不同的数据类型(java是强类型)。在上面的servlet中,我们看到了birthday这个属性的转换。看上去也不复杂,不过如何属性不是一个是100个呢?属性的类型也不再是基本类型呢?

解决这个问题的策略是使用表达式引擎

3 servlet的多线程问题。

这是一个比较大的问题,详细说明见

tomcat中的线程问题

http://blog.csdn.net/dlf123321/article/details/42222303

4 Control层作为mvc的核心控制器,如何能在最大程度上支持功能点上的扩展。

这个问题很大。

这其实就是一个不断分层细化的问题。

上面的那句话肯定让大家很是不懂。我来仔细说说。

想想我们之前讨论分层的时候,为什么要分层?因为分层后,把相同的逻辑功能点放到了一起不管是可读性还是扩展性都有了保证。

那就上面的servlet而言能不能再次进行功能细分呢?

首先我们看看在那个servlet中代码在逻辑层面上都干了什么。

1 获得参数

2 类型转换

3 执行核心业务逻辑

4 返回处理结果

其实一个servlet(程序执行与控制模块)干的事情无外乎就是上面四步。那么我们能不能把它们四个再分割呢?

就像一个汽车工厂,最开始的时候,从原料(钢铁)的获得,材料的切割,焊接,喷色到最后的销售都是一个人负责的(在上面的例子中,就是说上面的四点都是在一个servlet中干的),这好不好?不好。为什么?

如果本来车子是喷蓝色油漆,我现在想改成喷白色漆。在一个人干所以事情的架构下回很麻烦,那怎么办?

做一条"流水线",一个人负责采购原料,一个人负责原料切割,一个人负责喷漆......

我现在想要改变喷漆的颜色,直接找那一个人就OK。

我们回到代码上,问题的难点在于,要构建一条"流水线"是很麻烦的,特别是这个流水线不仅能生产汽车,还能生产飞机,还能生产大炮。总而言之,这个"流水线"应该是一套规则,而不是实体。怎么做?我们自己来做流水线不现实的,所以看看前辈们的最佳实践,看看他们使用的框架是怎么构建"流水线"的。

5 View层的表现形式是多种多样的,随着Web开发技术的不断发展,MVC如何在框架级别提供一种完全透明的方式来应对不同的视图表现形式。

在之前的servlet中,我们是使用硬编码的形式来控制视图的流转。对上面这个问题的解决,其实也是第二个问题的答案。构建流水线。

6 MVC模式虽然很直观的为我们规定了表示层的各种元素,但是如何通过某种机制吧这些元素有机的整合在一起,从而形成一个整体呢。

这个问题太大,我在目前没有办法理解,只能截图了。

参考资料

http://blog.csdn.net/dlf123321/article/details/42222303

时间: 2024-08-02 02:34:27

Struts2技术内幕 读书笔记三 表示层的困惑的相关文章

Struts2技术内幕 读书笔记一 框架的本质

本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书.笔记中所用的图片若无特殊说明,就都取自书中,特此声明. 什么是框架?我们为什么要用框架?框架能给我们带来什么? 这几个问题既简单又复杂.说它简单,是因为框架确实存在在软件设计中,说它复杂是因为我们现在所使用的框架不论是spring还是struts都是经过多年的发展,其内部已经十分庞杂了,因此想一句话两句话说清楚一个框架就不是那么简单了. OK,既然现有的框架都很复杂,那我们

Struts2技术内幕 读书笔记二 web开发的基本模式

最佳实践 在讨论基本模式之前,我们先说说一个词:最佳实践 任何程序的编写都得遵循一个特定的规范.这种规范有约定俗称的例如:包名全小写,类名每个单词第一个字母大写等等等等;另外还有一些需要我们严格遵守的:例如我们写自己的servlet的时候就得继承javax.servlet.http.HttpServlet接口. 在标准之上的是对不同标准的具体实现.例如同是servlet标准,tomcat有一套实现方式,Websphere又有不同的实现方式. 在程序员级别来说,面对复杂的业务流程,不同的程序员会有

spring技术内幕读书笔记之IoC容器的学习

第一篇:概念和设计原理 IoC容器的实现作为Spring的核心内容之一非常有必要拿来研究一下 1.概念 IoC(Inversion of Control,控制反转)必须思考的问题:哪些方面的控制被反转了? 对于这个问题,Martin Flower给出结论是:依赖对象的获得被反转了.基于此,他为控制反转创造了一个更好的名字:依赖注入. SpringIoC模块是这一思想的一种实现,IoC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,降低了组件之间的耦合度,利于功能复用,方便进行

&lt;&lt;深入分析javaWeb技术内幕&gt;&gt;读书笔记-JVM内存管理2

JVM垃圾回收策略 1.静态内存分配和回收 编译时已经确定了内存空间大小,程序被加载后则一次性分配好内存空间.程序结束后,则对应栈帧撤销,分配的静态内存空间则被回收. 2.动态内存分配和回收 程序运行动态分配内存空间,回收时则由垃圾收集器负责. 3.垃圾收集器 A.正确的检测出垃圾对象(关键功能) B.释放垃圾对象占用的内存空间 4.基于分代的垃圾收集算法(hostpot) 算法设计思路: 把对象按照寿命的长短进行分组(年轻代,年老代),新创建的对象分配在年轻代中,对象经过几次垃圾回收后,仍然存

&lt;&lt;深入分析javaWeb技术内幕&gt;&gt;读书笔记-Javac编译原理

1.javac是什么? javac是一种编译器,能将一种语言规范转化为另一种语言规范. 2.javac的任务是什么? 将java源代码语言先转化成JVM能够识别的的一种语言,然后由JVM再将JVM语言转化成当前机器识别的机器语言.表面上,将.java文件转成.class文件,而实际上是将java源代码转化成一串能被jvm识别的有格式二进制数字. 3.javac编译器的基本结构

《大型网站技术架构》读书笔记三:大型网站核心架构要素

一.性能—响应时间决定用户 (1)浏览器端: ①浏览器缓存: ②使用页面压缩: PS:Gzip压缩效率非常高,通常可以达到70%的压缩率,也就是说,如果你的网页有30K,压缩之后就变成了9K左右.想要启用Gzip压缩,提高浏览速度,可以浏览这篇文章:http://www.chinaz.com/web/2012/1017/278682.shtml ③合理布局页面: CSS:把样式表置于顶部:避免使用CSS表达式(expression_r):使用外部JavaScript和CSS:削减JavaScri

《软件测试方法和技术》 读书笔记

<软件测试方法和技术> 读书笔记 2014-07-17 第一章 引论  1.3 什么是软件测试  1.4 软件测试与软件开发的关系第二章 软件测试基本概念  2.1 软件缺陷  2.3 软件测试的分类  2.4 测试阶段  2.5 软件测试的工作范畴第三章 软件测试方法  黑盒测试    边界值测试    等价测试      报表日期      三角形    基于决策表的测试      NextDate函数  白盒测试    语句覆盖    判定覆盖    条件覆盖    判定条件覆盖   

【转】COM技术内幕(笔记)

COM技术内幕(笔记) COM--到底是什么?--COM标准的要点介绍,它被设计用来解决什么问题?基本元素的定义--COM术语以及这些术语的含义.使用和处理COM对象--如何创建.使用和销毁COM对象.基本接口--描述IUnknown基本接口及其方法. 掌握串的处理--在COM代码中如何处理串.应用COM技术--例子代码,举例说明本文所讨论的所有概念. 处理HRESULT--HRESULT类型描述,如何监测错误及成功代码.COM--到底是什么? 简单地说,COM是一种跨应用和语言共享二进制代码的

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①