第一个 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
.
然后通过这个值找到对应的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