首页 > 代码库 > Struts2技术内幕 读书笔记三 表示层的困惑

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=http://www.mamicode.com/"dlf" />>
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


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