Spring MVC架构图
M——模型(Model)
数据,dao,bean
V——视图(View)
网页、JSP,用来展示模型中的数据
C——控制器(Controller)
把不同的Model显示到不同的View上,Servlet扮演这样的角色。
一、通过XML配置/注解配置的方式创建例子
XML配置
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
web.xml
拦截所有的请求,交由Spring MVC的后台控制器来处理。
<?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">
<bean id="simpleUrlHandlerMapping"
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- /hello 路径的请求交给 id 为 helloController 的控制器处理-->
<prop key="/hello">helloController</prop>
</props>
</property>
</bean>
<bean id="helloController" class="controller.HelloController"></bean>
</beans>
Spring MVC的映射配置文件
package controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class HelloController implements Controller {
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView("index.jsp");//表示视图的是index.jsp
mav.addObject("message", "Hello Spring MVC");//模型数据的是 message,内容是 “Hello Spring MVC”
//通过 ModelAndView 对象把模型和视图结合在一起
return mav;
}
}
Controller
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<h1>${message}</h1>
index.jsp
注解配置
<?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:component-scan base-package="controller"/>
<!--删除XML的配置,增加一句组件扫描-->
</beans>
package controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
//声明控制器
@RequestMapping("/adress")
//如果作用在类上,那么相当于给该类所有配置的映射地址前加上了一个地址。
//即访问地址:localhost/adress/hello
public class HelloController{
@RequestMapping("/hello")
//路径/hello会映射到该方法上
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
ModelAndView mav = new ModelAndView("index");
mav.addObject("message", "Hello Spring MVC");
return mav;
}
}
为防止数据泄露,将JSP 文件配置在【WEB-INF】文件夹中的【page】文件夹下
【WEB-INF】是 Java Web 中默认的安全目录
在 dispatcher-servlet.xml 文件中做如下配置:
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/page/" />
<property name="suffix" value=".jsp" />
</bean>
该解析器是遵循着一种约定:会在视图名上添加前缀和后缀,进而确定一个 Web 应用中视图资源的物理路径的。
前缀:/WEB-INF/page/
逻辑视图名:index
后缀:.jsp
二、Spring MVC请求跟踪:
1、请求到达DispatcherServlet(前端控制器)
Servlet拦截HTTP请求,并将请求发送给Spring MVC控制器。
2、处理器映射(HandlerMapping)
处理器映射会根据请求所携带的URL信息来进行决策,使DispatchServlet确定请求下一站。
3、DispatchServlet将请求发送给选中的控制器,到达控制器,请求卸下负载(用户请求)等待控制器处理完这些信息。
4、控制器将返回信息(Model)打包,并且表示出用于渲染输出的视图名(逻辑视图名),接下来将模型和视图名(封装到ModelAndView)发送回DispatcherServlet。
5、视图解析器
将逻辑视图名匹配为一个特定的视图实现。
6、视图
交付模型数据,视图使用模型数据渲染出结果,结果通过响应对象传递给客户端。
补充:
1、使用 @RequestParam("前台参数名")
来注入
@RequestParam 注解有三个变量:
value :指定 name 属性的名称是什么,value 属性都可以默认不写
required :是否必须要有该参数,可以设置为【true】或者【false】
defaultvalue :设置默认值
要求:前台参数名字必须和模型中的字段名一样
2、文件上传
2.1导包
commons-io-1.3.2.jar 和 commons-fileupload-1.2.1.jar
2.2配置上传解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
2.3编写jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>测试文件上传</title>
</head>
<body>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="picture">
<input type="submit" value="上 传">
</form>
</body>
</html>
2.4编写控制器
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UploadController {
@RequestMapping("/upload")
public void upload(@RequestParam("picture") MultipartFile picture) throws Exception {
System.out.println(picture.getOriginalFilename());
}
@RequestMapping("/test2")
public ModelAndView upload() {
return new ModelAndView("upload");
}
}