springMVC框架作为JavaWeb开发中的主流框架,每一个java程序员都多多少少对它耳熟。作为一个Web开发程序员,我同样也对这个框架充满着强烈的好奇心。
于是试着学习一下这个框架, 刚学的时候尝试翻译Spring官方文档,但是发现90%的时间都花在翻译上去了,学习的效果差强人意。于是买了一些书,通过看书结合实例操作,感觉进步很快。 最近再写几篇博客,对自己所知道的使用方法和原理进行总结归纳,会更加容易看到自己的不足之处,督促自己学习更多的知识。
之前总是听说SpringMVC是怎么怎么方便,如何如何好用。用的时候配置几个配置文件,引入几个jar包,好像感觉也确实挺方便的,但是具体方便在那里其实并不知道。
就像有人说小汽车很快,比骑自行车快。然后你的代步工具也都是汽车,从来没骑过自行车。但汽车到底比自行车快在那里其实不清楚,因为自己从没骑过自行车。不知道自行车的速度,不知道自行车的运行原理,至于汽车相比较自行车升级了那些部件,那就更加不知道了。
对于Spring也同样如此,于是,我知道我该自己写一个Web应用了。
自定义Servlet:
打开MyEclipse.........=。=
1.配置web.xml
<servlet>
<!--Servlet名称-->
<servlet-name>DispatcherServlet</servlet-name>
<!--Servlet名称所映射的类-->
<servlet-class>appx01.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--发生请求时,所调用的Servle-->
<servlet-name>DispatcherServlet</servlet-name>
<!-- 映射的请求后缀 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
注:
web.xml虽然是用在javaWeb项目中,但是实际上读取这个配置的是项目所在的Tomcat容器。
配置详解:
<servlet> 功能是配置一个名为DispatcherServlet的Servlet(服务器端的java小程序。用来接收、处理客户端请求,返回响应。)
<servlet-mapping>标签,主要是告诉tomcat,在遇到以.action结尾的请求时,直接交给名为名为DispatcherServlet的Servlet去处理。(=。=有点绕)
2.编写简单DispatcherServlet
DispatcherServlet 又可以翻译成前置控制器。顾名思义,就是放在前面的一个控制程序,意味着这个程序 会优先处理请求。如果不去细究底层原理,单单从web上来看的话,确实也是如此。因此暂且先这么理解,
会更加容易理解之后的一些概念。
概念讲完,现在接着第一步。先新建一个名为DispatcherServlet的类,并继承HttpServlet,一个自定义的
Servlet就这样写好了。当然这肯定是远远不够的,先还需对请求进行处理,此时,只要重写 doGet和doPost方法,并在方法中
处理相应的请求即可。
注:这两种方法分别对应浏览器的GET和POST请求,对于这两种请求方式区别以后可以再探讨探讨。
代码如下
package appx01.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import appx01.controller.Controller;
import appx01.controller.impl.InputController;
import appx01.controller.impl.SaveControllerImpl;
public class DispatcherServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.process(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
this.process(req, resp);
}
private void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
String url = req.getRequestURI(); //第一部分
int index = url.lastIndexOf("/");
String action = url.substring(index+1);
String returnPath = new String();
Controller controller = null; //第二部分
if("product_save.action".equals(action)){
controller = new SaveControllerImpl();
}else{
controller = new InputController();
}
returnPath = controller.handleRquest(req, resp);
RequestDispatcher rd = req.getRequestDispatcher(returnPath); //第三部分
rd.forward(req, resp);
}
}
现在对这注解的三部分进行详解
第一部分:主要功能是对请求URL解析出具体的请求字符串,方便后续的处理,这里有一个方法值得注意一下
req.getRequestURI(),这个方法返回的不是全量URL地址。返回的是URL的一部分,并且POST请求和GET请求返回
的长度有区别。
第二部分:根据解析出的请求,新建不同的对象,在handleRquest方法中对请求执行相应的处理逻辑,例如直接返回的转发页面(地址),或者在request请求中设置相应的属性再返回需要转发的目标。这一步操作是模拟简单的web请求,具体的执行在SaveController和InputController中,有兴趣的可以Q我,发源码给你参考一下。
第三部分:请求的转发。request对象获取RequestDispatcher,中间传参returnPath是你想要转发的资源。对于RequestDispatcher的作用简单介绍就是一个路径资源的包装器。只要你给定相应的路径,这个对象就会把这个路径(或者称之为资源)给包装起来。之后你就可以选择将请求给转发到这个资源(forward方法),或者包含在response中(include方法)。
到目前为止,一个DIY的迷你前置控制器(DispatcherServlet)就诞生了。麻雀虽小,但是该有的功能也有,通过这个mini的MVC也大概了解到MVC的工作模式,对于后续的SpringMVC的学习以及SpringMVC的优缺点会打下一个基础。