SpringMVC
- 创建web 项目
- 编写web.xml, 注册servlet
- 编写springMVC 配置文件
- 注册视图解析器
- 编写控制器
- 编写界面
项目结构
SpringMVC 流程图
SpringMVC 入门程序
- web.xml
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<!-- 注册一个前端控制器
DispatcherServlet
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- spring 配置文件(sringmvc-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--
InternalResourceViewResolver
配置一个视图解析器
常用:内部资源视图解析器
-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
</bean>
<bean class="HelloController" name="/helloController" />
</beans>
- HelloContorller.java
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
* @ClassName HelloController
* @Author 秃头的JJ
* Date 2019/5/30 0030 22:53
* Version 1.0
* 实现一个Controller 接口的方式
*/
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
// 创建ModelAndView 实例
ModelAndView modelAndView = new ModelAndView();
// 设置参数
modelAndView.addObject("msg", "欧阳铁柱");
// 逻辑视图名 --- name.jsp
modelAndView.setViewName("name");
//返回ModelAndView 实例
return modelAndView;
}
}
- name.jsp
<%@ page import="org.springframework.web.servlet.ModelAndView" %><%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/30 0030
Time: 23:07
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
<title>Title</title>
</head>
<body>
name:${msg }
</body>
</html>
入门代码分析
前端控制器(web.xml)
配置前端控制器,目的在于让SpringMVC 去处理所有请求
配置
/
:不会拦截*.jsp/*
:会拦截所有,导致报404 错误*.do
:拦截以.do 结尾的支援
spring 配置文件的名字
- 默认需要定义为[servlet-name]-servlet.xml
- 修改为自定义名字
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>springmvc</param-value>
</init-param>
</servlet>
- 默认路径为/WEB-INF
- 修改路径
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
视图解析器
- springMVC 支持多种视图技术
jsp、freemark、thymeleaf
- 这里使用的是内部的资源视图解析器
- 视图前缀
- 视图后缀
<!-- 前缀 -->
<property name="prefix" value="/jsp/" />
<!-- 后缀 -->
<property name="suffix" value=".jsp" />
modelAndView.setViewName("name");
- 实际上是配置了访问资源的前缀和后缀,即访问路径为/jsp/XXXX.jsp
- XXXX 为modelAndView 实例调用setViewName() 方法设置的名称
- 该方式实现的功能等价于
httpServletRequest.getRequestDispatcher("jsp/name.jsp").forward(httpServletRequest, httpServletResponse);
,但是不能讲MadeAndView 实例进行传输
控制器
xml 开发模式
- 这里的控制器是使用的传统的实现接口(Controller)的方式实现的
- 在实现Controller 接口后,会实现handleRequest() 方法,并返回ModeAndView 的实例
- ModeAndView 是SpringMVC 用来将模型和视图结合使用的,再Mode 填充对象,再具体的视图
进行展示- 对Controller 实现类的配置
在实现接口并实现方法后,在spring 配置文件内对Contorller 配置Bean.
需要配置Bean 所在类以及Bean 的名称(id / name), 并且以名称作为方式的URI
<!-- 该Bean 使用/helloController 和/test 都可以访问 -->
<bean class="HelloController" name="/helloController" id="/test" />
注解开发模式(开发常用)
- 基本注解
- @Contorller
- @RequestMapping
注解使用前提
- 配置注解扫描
- RequestMapping 注解
- 该注解可以在Class 上配置,也可以在Method 上配置(一般都是组合使用)
- 组合使用时,需要在spring 配置文件内使用<context:component-scan base-package=“packgeName” /> 进行包扫描注解
- 测试程序
- web.xml(前端控制器)
<!-- 注册一个前端控制器
DispatcherServlet
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>springmvc</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
- springMVC 配置文件 —> 添加context 的命名空间用于配置注解
<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 配置注解 -->
<context:annotation-config></context:annotation-config>
</beans>
- MyController.java(控制器)
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @ClassName MyController
* @Author 秃头的JJ
* Date 2019/5/31 0031 16:56
* Version 1.0
*/
// 创建控制器
@Controller
public class MyController {
// 拦截URI 为/test 的请求
@RequestMapping(value = "/test")
public String test(Model model){
// 想model 内添加数据
model.addAttribute("name", "欧阳铁柱");
// 这里return 的就是view 的名称 ----- /jsp/test.jsp
return "test";
}
}