SpringMVC 的初理解
项目中用到了jetty,springboot两种构建服务器的方式,jetty是一种嵌入式的方式,部署启动都很灵活,springboot最大的优点就是很多配置文件都自己集成好了,虽然用了这么多好的框架,但是我最近又迷茫了,这些框架到底是什么?怎么处理的?因此我又开始翻看了Tomcat,结合之前的学习和一些博客文章,记录一下,加深理解。
在写SpringMVC的时候,其实我们就是在写一个servlet。Tomcat即是一个HTTP服务器,也是一个servlet容器,主要目的就是包装servlet,并对请求响应相应的servlet,纯servlet的web应用似乎很好理解Tomcat是如何装载servlet的。
1、什么是servlet?
Servlet是sun公司提供的一门用于开发动态web资源的技术。
2、如何编写一个servlet?
2.1、编写一个Java类,实现HttpServlet接口,HttpServlet是在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。该类实现了Servlet的service方法,在方法体内判定了调用的是get,post,put,delete方法。如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost方法。用户只要根据自己的需求重写doGet,doPost方法就可以了。
2.2、把开发好的Java类部署到web服务器中。
2.3、用浏览器发送请求就可以。这里我用postman发送一个请求。
请求的地址:localhost:8080/ServletStudy/servlet/ServletDemo
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<TITLE>A Servlet</TITLE>
</HEAD>
<BODY>
This is class servlet.study.ServletDemo, using the GET method
</BODY>
</HTML>
如果是浏览器发送的请求,那么浏览器就会解析上面这段html
3、下面是一个servlet的实例:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<servlet-name>list</servlet-name>
<!-- 告诉容器,类完整的名字 包名.类名 -->
<servlet-class>web02.ListEmpServlet1</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>list</servlet-name> <url-pattern>/list</url-pattern> </servlet-mapping> </web-app>
package web02; import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ListEmpServlet extends HttpServlet {
public void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{ response.setContentType("text/html;charset=utf-8"); PrintWriter out=response.getWriter(); Connection conn=null; try {
Class.forName("oracle.jdbc.driver.OracleDriver");
try {
conn=DriverManager.getConnection("jdbc:oracle:thin:@10.10.141.151:1521:orcl",
"wwj",
"Admin@1234"); out.println("<table width='60%' border ='1' cellpadding='0' cellspacing='0'>");
out.println( "<tr><td>姓名</td><td>薪水</td><td>年龄</td>"
+ "</tr>");
String sql=("SELECT name,salary,age from servlet_wu"); PreparedStatement stat=conn.prepareStatement(sql); ResultSet rst=stat.executeQuery(); while(rst.next())
{
String uname=rst.getString("name");
Double salary=rst.getDouble("salary");
int age=rst.getInt("age");
out.println("<tr>"
+ "<td>"+uname
+ "</td><td>"+salary
+ "</td><td>"+age
+"</td></tr>");
}
out.println("</table>"); //out.println("添加员工成功");//这句话在重定向之后会被清除,想要输出
//需要用脚本JS
response.sendRedirect("list"); } catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// 记日志
e.printStackTrace(); } out.close();//关流或者servlet关闭后,服务器就会从响应对象中 } }
看到这个实例可以清楚的看到,一个servlet里面包括了很多,主要有:请求数据的解析,连接数据库,解析数据,返回给浏览器。一个两个还好维护,也很轻松,但是如果有十个,百个,千个呢?不敢想象。为了解决这个问题,MVC思想被应用过来,解救了广大的程序猿。
4、spring web mvc的原理图如下。

加载过程原理分析:
整个MVC的中心是dispatcherServlet,它处理了controller类的加载,请求地址与controller的映射,viewResolver类的处理,就是所谓的MVC。
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
initLocaleResolver(context);
initThemeResolver(context);
initHandlerMappings(context);
initHandlerAdapters(context);
initHandlerExceptionResolvers(context);
initRequestToViewNameTranslator(context);
initViewResolvers(context);
initFlashMapManager(context);
}
这些都是初始化的时候需要做的事。
当用户的请求过来之后,具体流程步骤如下:
1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
2、 DispatcherServlet——>HandlerMapping。ApplicationContext.xml中id=handlermapping类会将请求的地址与控制器对应的map,然后DispatcherServlet类会把请求地址与servlet对应上。加载applicationContext.xml中的bean对应的类,处理viewresolver。
3、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
4、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
5、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
6、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
下面是我之前自己写的一个例子:
web.xml的配置
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<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:applicationContextmvc.xml</param-value>
</init-param>
<!-- 启动tomcat之后优先启动 -->
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping> </web-app>
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xmlns:jdbc="http://www.springframework.org/schema/jdbc"
xmlns:cache="http://www.springframework.org/schema/cache"
xsi:schemaLocation="
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/jdbc
http://www.springframework.org/schema/jdbc/spring-jdbc-3.1.xsd
http://www.springframework.org/schema/cache
http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 配置handlerMapping -->
<bean id="handlermapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<!-- 请求和controller对应的关系 -->
<property name="mappings">
<props>
<prop key="/list.do">listController</prop>
<prop key="/add.do">addController</prop>
<prop key="/modify.do">modifyController</prop>
<prop key="/delete.do">deleteController</prop>
<prop key="/update.do">updateController</prop>
</props>
</property>
</bean>
<!-- 配置controller -->
<bean id="listController" class="springMVCmybatis.listController">
</bean>
<bean id="addController" class="springMVCmybatis.addController">
</bean>
<bean id="modifyController" class="springMVCmybatis.modifyController">
</bean>
<bean id="deleteController" class="springMVCmybatis.deleteController">
</bean>
<bean id="updateController" class="springMVCmybatis.updateController">
</bean>
<!-- 配置viewResolver -->
<bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/">
</property>
<property name="suffix" value=".jsp">
</property>
</bean>
</beans>
附言:
1、如果你看不懂springmvc的代码过程,可以先看看jetty的,有助于理解。
2、由于本人水平有限,有些地方写的模棱两可,后面再写详细点。
参考博客:
1、http://blog.csdn.net/tiantiandjava/article/details/47663853
2、http://jinnianshilongnian.iteye.com/blog/1594806
3、http://www.cnblogs.com/xdp-gacl/p/3760336.html
SpringMVC 的初理解的更多相关文章
- EventBus初理解
缘由: 平时工作,因为懒于动笔的原因,也没注重技术和经验的积累,导致之前曾经研究过的问题现在又忘记了,所以要慢慢注重积累,那么就从写作开始,谈谈对工作中碰到的问题进行整理和归纳. 我们 ...
- SpringMVC的一点理解
1.MVC(Model-View-Controller) 用慕课网上的一个图来看看MVC Front Controller(前端控制器):把客户的请求分发给不同的控制器去生成业务数据,将生成的业务数据 ...
- 微冷的雨之Java中的多线程初理解(一)
在讲解多线程前,我们必须理解什么是多线程?而且很多人都会将进程和线程做对比. 进程和线程 进程:进程是操作系统结构的基础,是一次程序的执行,是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在 ...
- 你对SpringMvc是如何理解的?
SpringMVC工作原理 SpringMvc是基于过滤器对servlet进行了封装的一个框架,我们使用的时候就是在web.xml文件中配置DispatcherServlet类:SpringMvc工作 ...
- Maximum Entropy Model(最大熵模型)初理解
0,熵的描述 熵(entropy)指的是体系的混沌的程度(可也理解为一个随机变量的不确定性),它在控制论.概率论.数论.天体物理.生命科学等领域都有重要应用,在不同的学科中也有引申出的更为具体的定义, ...
- 前后端分离springmvc和RESTful理解
1. 理解MVC MVC是一种经典的设计模式,全名为Model-View-Controller,即模型-视图-控制器. 其中,模型是用于封装数据的载体,例如,在Java中一般通过一个简单的POJO(P ...
- springmvc处理过程理解(一)
DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器:根据url查找Handler.(可以通过xml配置方式,注解方式) H ...
- springMVC框架的理解加深,个人的一些想法
一 写spring-boot整合的时候,有种想看源码的冲动!呸,是钻牛角尖的毛病犯了... @RequestMapping("/index") public String inde ...
- spring boot 的redis 之初理解
项目到末尾了快, 这几天安排我结合业务场景给项目加上redis 缓存, 我接到这个任务也是懵逼了一会儿: 问了一句让我自己先想办法,没办法硬着头皮查吧, 要不不得不说spring boot 还是好用, ...
随机推荐
- 【LA3415 训练指南】保守的老师 【二分图最大独立集,最小割】
题意 Frank是一个思想有些保守的高中老师.有一次,他需要带一些学生出去旅行,但又怕其中一些学生在旅行中萌生爱意.为了降低这种事情发生的概率,他决定确保带出去的任意两个学生至少要满足下面四条中的一条 ...
- linux系统中的变量
一.定义 所谓的变量,就是就是利用一个特定的"名称"(name)来存取一段可以变化的"值"(value),简单说来就是“用一个名称储存一个数值”. 二.设定 ...
- CentOS 6.4一键自动化安装ISO镜像光盘
下载CentOS-6.4-x86_64-minimal.iso 1 http://mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-mi ...
- 面向对象的JavaScript-004
1. // Below is an example of how to use Object.create() to achieve classical inheritance. This is fo ...
- 1256 Anagram
题目链接: http://poj.org/problem?id=1256 题意: 根据自定义的字典序: 'A'<'a'<'B'<'b'<...<'Z'<'z' 和输 ...
- MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
今天购物车突然不能添加了,发现redis报错了,重启了一下好了,一会又报错了. 错误信息: MISCONF Redis is configured to save RDB snapshots, but ...
- CentOS下的Git服务器
[Gitosis]CentOS下的Git服务器:Gitosis [摘要] 详细介绍如何在CentOS上配置Gitosis 我们很多人知道Git可能是从Github开始的 ...
- mybatis-generator命令行生成代码
目录文件如下: generator.xml文件如下: <?xml version="1.0" encoding="UTF-8"?> <!DOC ...
- C++学习--第一个程序
C++控制台应用程序 我们创建一个包含预编译头的C++控制台应用程序时,会发现其结构是这样的: 1)理解预编译头文件: 所谓头文件预编译,就是把一个工程(Project)中使用的一些MFC标准头文件( ...
- 部署图像深度学习Web网站
1. 内网穿透 2. 深度学习Web化 https://www.cnblogs.com/haolujun/p/9778939.html