博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringMVC 的初理解
阅读量:5341 次
发布时间:2019-06-15

本文共 5559 字,大约阅读时间需要 18 分钟。

  项目中用到了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

            A Servlet            This is class servlet.study.ServletDemo, using the GET method  

如果是浏览器发送的请求,那么浏览器就会解析上面这段html

3、下面是一个servlet的实例:

list
web02.ListEmpServlet1
list
/list

  

  

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("
"); out.println( "
" + "
"); 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("
" + "
"); } out.println("
姓名 薪水 年龄
"+uname + " "+salary + " "+age +"
"); //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的配置

springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:applicationContextmvc.xml
1
springmvc
*.do
  

applicationContext.xml

listController
addController
modifyController
deleteController
updateController
  

附言:

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

转载于:https://www.cnblogs.com/boywwj/p/7295619.html

你可能感兴趣的文章
#10015 灯泡(无向图连通性+二分)
查看>>
忘记root密码,怎么办
查看>>
linux设备驱动归纳总结(三):1.字符型设备之设备申请【转】
查看>>
《黑客与画家》 读书笔记
查看>>
bzoj4407: 于神之怒加强版
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
css3渐变画斜线 demo
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>