一、Springmvc架构
Springmvc 属于表现层的框架 , 作用就是controller(控制层,替换以前的servlet),它是 Spring 框架的一部分 , 我们可以从 Spring 的整体结构中看出来:
Spring MVC 处理请求的流程
具体执行步骤如下:
1、(图1、2步骤)首先用户发送请求————> 前端控制器,前端控制器根据请求信息(如 URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分
2、(图3、4、5步骤)页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,这个对象在 Spring Web MVC 中叫命令对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个 ModelAndView(模型数据和逻辑视图名)
3、(图6、7步骤)前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染
4、(图8步骤)前端控制器再次收回控制权,将响应返回给用户
Spring MVC架构图
spring mvc的执行过程:客户端发送请求到DispatcherServlet,把相应的请求给HandlerMapping(然后给Adapter进行处理(比如到哪个界面,数据返回给哪个界面,对数据要做哪些处理
会返回一个modelandview(数据和视图),把这个modelandview给DispatcherServlet 给视图渲染器(viewResolver)
再返回到DispatcherServlet,最后才能看到好的网页))
核心对象:第一个对象:DispatcherServlet
第二个:HandelerAdapter
第三个:视图渲染器
二、开发一个Springmvc
1.导入jar包(核心jar包spring-webmvc-3.2.13.RELEASE.jar)
2.配置核心xml文件(springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:p="http://www.springframework.org/schema/p"
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
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd">
②配置controller(两种)
<!--name是url匹配地址(第一种controller单一配置)-->
<bean name="/index.html" class="com.offcn.controller.UserController"></bean>
<!--扫描controller下所有的包(第二种)-->
<context:component-scan base-package="com.offcn.controller" />
③配置由网页进入到控制层(两种)
<!--当你的请求地址是index.html的时候,就会到UserController这个类(第一种)-->
<bean name="/index.html" class="com.offcn.controller.UserController"></bean>
<!--开启注解驱动(第二种)-->
<mvc:annotation-driven />
④完成视图的对应
<!--完成视图的对应-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--开始配置jsp包的路径-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
3.将核心配置文件配置到web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置servlet-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc-servlet.xml</param-value>
</init-param>
<!--立刻加载-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
4.控制层的配置
第一种方式(非注解):
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class UserController implements Controller {
/**
* 当客户端发送请求的url地址匹配这个类时运行这个方法-->HandlerMapping
* @param httpServletRequest
* @param httpServletResponse
* @return
* @throws Exception
*/
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest httpServletRequest, javax.servlet.http.HttpServletResponse httpServletResponse) throws Exception {
//跳转页面
return new ModelAndView("doIndex");
}
第二种方式(注解)(通过注解不同的传参方式)
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import java.util.Map;
@Controller
@RequestMapping()
public class UserController {
/**
* 注解的方式
* @param userName 页面参数(required代表参数可有可无,默认为true)
* @return
*/
/* @RequestMapping(value = "index",method = RequestMethod.GET)
public String index(@RequestParam(value ="userName",required = false) String userName){
System.out.println(userName);
return ("doIndex");
}*/
@RequestMapping(value = "/index/{pid}")
public String index(@PathVariable String pid){
System.out.println(pid);
return "doIndex";
}
//把controller的数据传到Jsp中
@RequestMapping(value = "toDoIndex1")
public ModelAndView toDoIndex(String userName){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("userName",userName);
//把跳转的页面放到modelAndView里
modelAndView.setViewName("doIndex");
return modelAndView;
}
@RequestMapping(value = "toDoIndex2")
public String toDOIndex(String userName, Map<String,Object> map){
map.put("userName",userName);
return "doIndex";
}
//常用版
@RequestMapping(value = "toDoIndex")
public String toDoIndex(String userName, Model model){
model.addAttribute("userName",userName);
return "doIndex";
}
//常用版
@RequestMapping(value = "toLoading")
public String toLoading(
@RequestParam(value = "userName",required = false)String userName,
@RequestParam(value = "password",required = true) String password){
return "doIndex";
}
}
总结:web.xml(加载前段控制器,引入核心配置文件) 用户发送一个请求----->(当请求有匹配的controller)—>到实体bean(controller)---->返回一个modelAndView----->springmvc-servlet.xml---->视图渲染器----->网页(jsp接收)