第一个 JAVA WEB 应用

第一个 JAVA WEB 应用

注意:本文的基本条件是基于Tomcat常规 java web开发,web 开发的模式非常对,种类也非常多,切勿对号入座。

接上一篇文章,本章讲解下搭建第一个Java Web应用。当然,如果只是导入运行完事,那么没必要看这篇文档,因为我向稍微细致讲解下,以方便读者更加清楚的理解下原理。

事实上我写这篇文章是有一定个人想法的,有那么一段时间,我接触过一些刚接触java web的小伙伴(新手也行,菜鸟也罢), 很大部分人有一个共性,就是一上来就要搞大框架,什么SSH框架,什么SSM框架,这一点我其实很反对,当然我并不反对用框架,只是觉得没有比较刚一上来就要去接触什么大框架,很多人就是在这些框架中把自己搞混了,以至于很快从入门到放弃, 所以,这篇文章我要讲的是很原始的java web,没有任何框架,就是希望你读了之后能对jiava web有更加直观的认识,并且多说一句,一旦你能够形成这个直观且清醒的认识,你会发现,那些所谓的框架,其实都是基于而开发的,无非就是简化开发周期,加快效率罢了,甚至到最后,你更想自己手撸一套自己的框架。

看过别人的代码的小伙伴肯定对 web.xml 这个文件有映像, 开发java web, 第一点,也是至关重要的一点,就是要正确理解web.xml 文件,下面是一个web.xml的文件示例,为了突出重点,很多其他边边角角的配置我都没加,这样才能更加突出核心。

<web-app>
    
    <display-name>WebDemo</display-name>
    
    <servlet>
        <servlet-name>TestServlet</servlet-name>
        <servlet-class>com.webdemo.servlet.TestServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>TestServlet</servlet-name>
        <url-pattern>/TestServlet</url-pattern>
    </servlet-mapping>

</web-app>

先脑补一个场景,一次http请求具体的流程应该是什么:

浏览器发出http请求 -> 服务器接收请求 -> 服务器找到可以处理该类的方法 -> 处理请求 -> 返回结果给浏览器

可能不全面,但是基本上就这个流程,那么在这个流程中,我们用到的 Tomcat 就充当了服务器这个角色,那么流程的第三阶段“服务器找到可以处理该类的方法”显得非常重要,服务器凭什么去找到这个方法,凭的就是web.xml 的配置,注意看在 web.xml 中有一对<servlet></servlet>标签和<servlet-mapping></servlet-mapping>标签。

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.webdemo.servlet.TestServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
</servlet-mapping>

注意在 <servlet><servlet-mapping> 标签中都定义了一个 <servlet-name>, 并且他们的值都一样(这里均为 TestServlet), 像这样的<servlet-name>拥有相同值的servlet 和 servlet-mapping 构成一对请求处理对应关系,怎么构成的呢。

首先, 在 <servlet-mapping> 标签中,有一个<url-pattern> 标签,该标签中的值 /TestServlet 代表的意义就是uri path, 也就是我们实际通过浏览器访问的路径。

例如,在浏览器中输入: http://127.0.0.1:8080/MyWebapp/TestServlet, 那么 tomcat 解析出来的 uri 就是/TestServlet .

然后通过这个值找到对应的中的servlet-name的值, 也就是TestServlet

<servlet-mapping>
    <servlet-name>TestServlet</servlet-name>
    <url-pattern>/TestServlet</url-pattern>
</servlet-mapping>

接着根据这个值找到对应的,也就是:

<servlet>
    <servlet-name>TestServlet</servlet-name>
    <servlet-class>com.webdemo.servlet.TestServlet</servlet-class>
</servlet>

然后在这个标签中找到<servlet-class>中的值, 也就是 com.webdemo.servlet.TestServlet, 很明显,这是一个java类,然后Tomcat会去找到这个类来处理我们发出的请求

接下来就是进入这个类,看具体怎么去处理,先看代码:

public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter writer = resp.getWriter();
        writer.println("hello");
        writer.close();
    }
}

这个类需要继承 HttpServlet 在里面, 该类里面有一堆函数,类似于 doGet, doPost这些, 对应与不同的请求类型,例如如果是get方法的请求,那么会自动调用doGet方法。那么只需要在这个基础上继续写你的逻辑就行了。

是不死很简单,只要整个流程及逻辑关系理清楚了,其实一点也不复杂,那么回过头来,开始的时候,提了一句那些很牛逼的的框架,像SpringMVC, 其实也是基于这个来完成的,那么现在我们就来看看SpringMVC这个框架怎么用,使用SpringMVC时的第一个配置如下:

<servlet>
  <servlet-name>springmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <load-on-startup>1</load-on-startup>
  <init-param>
  	<!--SpringMVC配置参数文件的位置 -->
  	<param-name>contextConfigLocation</param-name>
  	<!--默认名称为ServletName-servlet.xml -->
  	<param-value>classpath*:springmvc-servlet.xml</param-value>
  </init-param>
</servlet>

<!--所有请求都会被springmvc拦截 -->
<servlet-mapping>
	<servlet-name>springmvc</servlet-name>
	<url-pattern>/</url-pattern>
</servlet-mapping>

注意看,其实也是一对<servlet-mapping><servlet> 组合,这个配置的意思是,所有的请求都转发到org.springframework.web.servlet.DispatcherServlet这个配置去处理,实际上,这个所谓的org.springframework.web.servlet.DispatcherServlet类,其实实质上和我们上面写的servlet类是一样了,只不过它更加复杂,更加牛逼。

所以,只要你精力足够,自己写一套框架实际上也不难吧,SpringMVC不也是基于这些基础的东西做的嘛。

本文的相关代码位于:https://github.com/codesedu/JAVAWEB-DEMO

posted @ 2020-02-19 19:09  代码之间  阅读(420)  评论(0编辑  收藏  举报