前言
框架的简化
- mybatis提供了对与数据库操纵的简化。
- spring提供了对对象的创建和管理的简化。
- 而springmvc就是提供了对原有的javawebMVC结构的简化以及功能加强。
框架的作用就是将许多功能代码抽象出来,让我们更加专注于业务逻辑代码的编写。
我们从传统的javaweb来一步一步的对现有的springmvc结构进行学习和理解。
MVC
-
MVC是模型(Model)、视图(View)、控制器(Controller)的简写,是一种软件设计规范。 是将业务逻辑、数据、显示分离的方法来组织代码。
-
MVC主要作用是降低了视图与业务逻辑间的双向偶合。
-
MVC不是一种设计模式,MVC是一种架构模式。当然不同的MVC存在差异。
Model(模型):数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
View(视图):负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
Controller(控制器):接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。 也就是说控制器做了个调度员的工作。
最典型的MVC就是JSP + servlet + javabean的模式
在javaweb项目中,我们是使用的
Model是javabean(service,dao)
View是jsp
Controller是Servlet
大概捋一捋mvc的思想就很清晰了。
回顾servlet
以前学习的时候都是在eclipse上写javaweb,而idea构建项目和eclipse有所不同,简单来构建一下。
因为第一次用idea配置tomcat,再加上路径名多了一个空格,配置的时候浪费了好多时间。
-
导入jar包
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>servlet-api</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>javax.servlet.jsp</groupId> <artifactId>jsp-api</artifactId> <version>2.2</version> </dependency> </dependencies>
-
新建servlet
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //取得参数 String method = req.getParameter("method"); if (method.equals("add")) { req.getSession().setAttribute("msg", "执行了add方法"); }else if (method.equals("delete")) { req.getSession().setAttribute("msg", "执行了delete方法"); }else { req.getSession().setAttribute("msg", "未检测到方法"); } //业务逻辑 // 视图跳转 //转发 req.getRequestDispatcher("WEB-INF/jsp/hello.jsp").forward(req, resp); //重定向 //resp.sendRedirect("hello.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
在web.xml注册servlet
<servlet> <servlet-name>HelloServlet</servlet-name> <servlet-class>com.lyj.servlet.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloServlet</servlet-name> <url-pattern>/user</url-pattern> </servlet-mapping>
-
写hello.jsp页面
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>okkkkkkk</title> </head> <body> <h1>这里是hello.jsp</h1> ${msg} </body> </html>
-
测试
这样,在浏览器输入
http://localhost:8080/user?method=add
http://localhost:8080/user?method=delete
就是一个简单省略了model的javaweb了
由javaweb到SpringMVC
javaweb中我们用servlet来对前端数据进行接受和对数据进行视图层的转发,而在springmvc中我们进一步进化这个操作,通过配置一个DispatcherServlet来对所有的servlet进行管理。
看一看DispatcherServlet的结构
它是继承了我们之前的Httpservlet类,实现了其解析url的功能。
它的继承结构关系是如上图关系所示。
SpringMVC工作原理
配置实现springmvc:
-
web.xml中配置参数
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
把标签去掉之后,它和之前配置servlet没有什么区别。
-
在springmvc-servlet.xml为它配置一些参数
它需要手动的配置一些参数
-
处理映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
-
处理器适配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
视图解析器
<!--视图解析器:DispatcherServlet给他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean>
试图解析器不配置的话就需要手动的加上路径名称来进行跳转。
-
-
Controller
public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //ModelAndView 模型和视图 ModelAndView mv = new ModelAndView(); //封装对象,放在ModelAndView中。 mv.addObject("msg","HelloSpringMVC!"); // 封装要跳转的视图,放在ModelAndView中 mv.setViewName("hello");//:/WEB-INF/jsp/hello.jsp return mv; } }
Controller接口是和DispatcherServlet配合使用的
- 它的源码是这样说明的,实现了这个接口的类会接受来自DispatcherServlet的req和resp请求,并且返回一个ModelAndView。
为controller注册bean
<bean id="/hello" class="com.lyj.controller.HelloController"/>
输入localhost:8080/hello测试
注解实现springmvc
-
在web.xml配置DispatcherServlet。
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
和之前一样,配置DispatcherServlet
-
配置springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <context:component-scan base-package="com.lyj.controller"/><!--包扫描--> <mvc:default-servlet-handler/> <mvc:annotation-driven/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean> </beans>
通过mvc:annotation-driven/注解驱动的方式来替换之前处理适配器和处理映射器的配置。在这种方法中,我们将DispatcherServlet的请求管理交给@Controller来做
-
@Controller
@Controller public class HelloController { @RequestMapping("/hello") public String index(Model model) { //向模型中添加属性msg与值,可以在JSP页面中取出并渲染 model.addAttribute("msg","hello,SpringMVC"); //web-inf/jsp/hello.jsp return "hello"; } }
-
测试
输入localhost:8080/hello测试。