java web和springmvc中的请求分发方式
今天我投的简历被查看了十二份,然而一个hr都没有给我打电话,自己就是一只菜鸡,吃饭的时候,问贝贝的hr,果然没有通过面试,难过是肯定的,回来一点都不想写作业,还是继续撸把代码吧,只有撸代码时才能不让自己想很多。先理一下java web 中的servlet和springmvc中的DispatcherServlet
一个简单的java web程序:
Servlet类:HelloWorld.java
public class HelloWorld extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setCharacterEncoding("gb2312");
PrintWriter out = response.getWriter();
String name = request.getParameter("username");
out.println("Your name: " + name);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.cqupt.javaweb.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
</web-app>
视图页面:index,jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<form action="/HelloWorld" method="post">
Your Name: <input type="text" name="username"/>
<input type="submit" value="submit"/>
</form>
</body>
</html>
servlet是java web的核心,作为一个servlet,首先需要继承HttpServlet类,在servlet中我们经常重写的方法就是doPost(HttpServletRequest request, HttpServletResponse response)和doGet(HttpServletRequest request, HttpServletResponse response),第一个方法处理HTTPget请求,第二个处理HTTPpost请求。
那么什么是servlet呢,servlet是运行在web服务器上的程序,处理来自客户端的请求,类似与controller接受用户请求,并转发给相应的action处理。但是servlet分发用户请求的方式和springmvc分发用户请求的方式有点不同。servlet分发请求需要在web.xml中注册,不知道用注册这个词正不正确,找不到合适的词。
<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>com.cqupt.javaweb.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern>
</servlet-mapping>
<servlet-class>标签是servlet所在的类的权限名,<url-pattern>标签用来匹配客户端的标签,如果客户端的请求为/HelloWorld,并且为post请求,那么就会调用HelloWorld类中的doPost方法。这里就可能会意识到使用servlet的弊端了,如果程序非常大的话,那肯定会有很多不同的servlet,不同的servlet处理不同的逻辑,并且在servlet中需要注册很多servlet,那么程序将不够健壮,不好维护。
当使用springmvc时,就不需要手动自动去维护了,spring为我们提供了一个DispatcherServlet类,使用方式如下:
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<load-on-startup>并不是必须的,如果存在,则它将在应用程序启动时装载servlet并调用init方法,应该就是初始化web.xml时调用init方法,否则在该servlet的第一个请求时进行加载。
DispatcherServlet初始化时会寻找一个在应用程序的web-inf目录下的配置文件,这个配置文件命名方式为servlet-name-servlet.xml,这里就应该为springmvc-servlet.xml,如果配置文件不满足这样的条件(包括位置和配置文件的名字),必须自己去指定它,这里就通过<init-param><param-name><param-value>标签去指定。另外spring通过注解,实现了一个控制器可以处理多个动作,并且请求映射通过使用注解不需要存储在配置文件中
这里还需要注意一下<url-pattern>/</url-pattern>和<url-pattern>/</url-pattern>会使程序运行出现不一样的结果,以前写项目的时候遇到过。/拦截所有资源,/只拦截静态资源,.jsp将不会被拦截,如果想要静态资源不被拦截的话,最简单的一种方法就是在spring配置文件加入下面一行代码:
<mvc:default-servlet-handler/>