Spring MVC 自学杂记(一)
来源:互联网 发布:adobe官网软件下载 编辑:程序博客网 时间:2024/05/16 18:04
Spring MVC
是spring提供的一个强大而又灵活的轻量级MVC框架,使用了MVC架构模式的思想,简化了日常web开发,实现了web层解耦。
MVC(model+view+controller)模式是软件工程的一种软件架构。
- 模型(model):用来保存数据,实现在数据库中获取。
- 视图(view):用来展示数据。
- 控制器(controller):负责从视图读取数据,控制用户输入,并向模型发送数据。
spring mvc中常用组件
- DispatcherServlet:前端控制器
- HandlerMapping:地址映射器
- ViewResolver:视图解析器
- controller:控制器
- ModelAndView:模型和视图
- View:视图
请求过程
简单实例
1、首先配置JAR包
maven pom.xml
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.0.2.RELEASE</version> </dependency>
2、配置前端控制器
在web.xml中配置
<!-- Spring MVC 的配置 --> <!-- ======================== --> <!-- 前端控制器 DispatcherServlet --> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- spring mvc 配置文件路径 如果不配置,默认是 /WEB-INF/[servlet-name]-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
因为DispatcherServlet前端控制器本身就是一个servlet,所以要在其中配置servlet和servlet-mapping。
所以的*.do的请求都会经过前端控制器,再由它根据地址映射器(HandlerMapping)分发到每一个控制器中去。
DispatcherServlet的上下文默认是在 /WEB-INF/[servlet-name]-servlet.xml中获取配置,如果想自定义路径,则需要配置
<init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:SpringMVC.xml</param-value> </init-param>
并且名字也必须是contextConfigLocation。
通常我们会把前端控制器配置成启动加载
<load-on-startup>1</load-on-startup>
在web.xml中还要配置spring的一些配置。
<!-- Spring 的配置 --> <!-- ========================= --> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:bean.xml</param-value> </context-param>
3、配置地址映射器(HandlerMapping)
<!-- 地址映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" > <property name="mappings"> <props> <!-- key:地址 value:控制器名 --> <prop key="startup.do" >firstController</prop> </props> </property> </bean>
这儿只是配置的一个实现类,一个简单的地址处理器,其中有很多处理器可以使用。
它会根据前端控制器传过来的请求链接 去选择相应的控制器,去实现具体的操作。
此处的属性 mappings 就是配置的 请求和控制器的一个映射关系,key值为请求,value为控制器名(及控制器bean的id)。
此处配置还有一种简单的方式:就是使用注解的方式,更加简单灵活。
4、控制器(controller)
控制器的实现有两种方式:
- 实现controller接口 或者 继承它的具体实现类
- 通过注解@controller来定义一个控制器
4.1、实现controller接口
package com.wm.spring.MVC.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.mvc.Controller;public class FirstController implements Controller{ @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { String ip = request.getRemoteHost(); System.out.println(ip); System.out.println("controller startup !"); return new ModelAndView("showFirst","ip",ip); }}
实现controller接口的方式 就要实现 方法:handleRequest,具体的操作实现就是在此方法中实现。
返回值ModelAndView 就是一个视图携带了一定的模型数据。返回的是逻辑视图名,然后 根据 视图解析器 解析视图名,去找到具体的视图,最后使用模型数据渲染视图,展示视图返回请求。
要把定义好的控制器注册到spring容器中,这样才可以被地址处理器(HandlerMapping)所使用:
<bean id="firstController" class="com.wm.spring.MVC.controller.FirstController"></bean>
4.2、通过注解的方式
注解:@controller 就是在容器中注册一个controller
package com.wm.spring.MVC.controller;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.servlet.ModelAndView;@Controllerpublic class StudentController { @RequestMapping(value="first.do") public ModelAndView toFirst(HttpServletRequest request, HttpServletResponse response){String ip = request.getRemoteHost(); System.out.println(ip); System.out.println("controller startup !");// return new ModelAndView("firsthtml","ip",ip); return new ModelAndView("MyJsp","ip",ip); }}
注解:@RequestMapping(value=”first.do”)
就相当于 handlerMapping中的一个请求。配置了此注解的方法就是 请求的控制器的具体实现。
使用了注解,就要在配置文件中加自动扫描注解:
<context:component-scan base-package="com.wm.spring.MVC.controller" />
通过注解的方式就可以不用配置 地址处理器(handlerMapping)。这种方式是 最简单也是最实用的。
5、视图解析器
<!-- 视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- prefix 前缀 suffix 后缀 --> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/page/" /> <property name="suffix" value=".jsp" /> <property name="order" value="10" /> </bean>
就是配置根据 控制器返回的 逻辑视图名 来找相对应的具体视图页面。
prefix:配置具体页面的前缀
suffix:配置页面的后缀
order:配置此视图解析器的顺序,在用于多个视图解析器的前提下,值越小就越先执行。
注:InternalResourceViewResolver这个解析器比较特殊,如果order设置为0,则最先执行它,但是如果没有对应的,则它不会向下执行了。所以如果要配置它在多个视图解析器中,一般配置此值最大。
6、目录层次结构
7、测试
页面showFirst.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE HTML><html> <head> <title>ShowFirst</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="This is my page"> </head> <body> <h1>show first</h1> <h2>your ip : ${ip }</h2> </body></html>
页面MyJsp.jsp
<body> <h1>my JSP</h1> <h2>your ip : ${ip }</h2> </body>
7.1、先测试 实现controller 接口的方式
请求为:startup.do
控制器:firstController
返回的视图名:showFirst
经过视图解析后的页面:/WEB-INF/page/showFirst.jsp
7.2、测试注解的方式
请求为:first.do
控制器:StudentController
返回的视图名:MyJsp
经过视图解析后的页面:/WEB-INF/page/MyJsp.jsp
至此,一个简单的spring mvc就实现了,个人感觉是十分的简洁,易用。
先只是一个简单的入门了解,后续还有一些比较复杂的实现与更强大的功能。
- Spring MVC 自学杂记(一)
- Spring MVC 自学杂记(四) -- Spring+SpringMVC+WebSocket
- 随笔录 之 spring 自学杂记(三) -- AOP(一)
- Spring MVC 自学杂记(二) -- 数据绑定之日期转换
- Spring MVC 自学杂记(五) -- SpringMVC与前台的json数据交互
- Spring MVC 自学杂记(六) -- 多视图解析器配置
- Spring MVC 自学杂记(七) -- 去掉静态资源的拦截
- Quartz框架 之 自学杂记(一)
- 随笔录 之 spring 自学杂记(二) -- IOC(二)
- 随笔录 之 spring 自学杂记(四) -- AOP(二)
- 随笔录 之 spring 自学杂记(五) -- JDBC
- 随笔录 之 spring 自学杂记(六) -- Transaction(TX)
- spring MVC自学第一章
- 自学spring mvc 笔记
- Spring mvc(一)
- Spring MVC(一)
- Spring MVC(一)
- Spring MVC(一)
- MVC进阶篇(一)——概览
- LensFlare Studio 5.8 for Mac 苹果版 简体中文 汉化版 超赞的光效处理软件
- 查看相册
- UML之类图分析
- LeetCode75. Sort Colors
- Spring MVC 自学杂记(一)
- LeetCode2. Add Two Numbers
- 记录在使用react-native-echarts中遇到的问题
- LeetCode141. Linked List Cycle
- LeetCode160. Intersection of Two Linked Lists
- 技术文章url
- Java 基础 字符串 方法
- Android4.4深入浅出之SurfaceFlinger总体结构
- Centos7 修改运行级别