SpringMVC
SpringMVC
SpringMVC是Spring内置的MVC框架,他的MVC模式(Model-View-Controller):解决页面代码和后台代码的分离。
SpringMVC原理
在没有使用SpringMVC之前我们都是使用Servlet在做Web开发。但是使用Servlet开发在接收请求参数,数据共享,页面跳转等操作相对比较复杂。servlet是java进行web开发的标准,既然springMVC是对servlet的封装,那么很显然SpringMVC底层就是Servlet,SpringMVC就是对Servlet进行深层次的封装。
SpringMVC执行流程和原理
Handler:处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具
体的用户请求进行处理,由于Handler涉及到具体用户业务请求,所以一般情况下Handler是由我们程序
员来进行开发的。实际上Handler就是我们开发的Controller。
View:视图
一般情况下需要通过页面的标签或页面模板技术展示给客户,需要由程序员根据业务需求开发具体的页
面。就是我们写的HTML,JSP
DispatcherServlet:中央控制器
用户请求到达前端控制器,它就相当于MVC模式中的C,DispatcherServlet是整个流程控制的核心。
由它来调用其他组件处理用户的请求,DispatcherServlet的存在降低了组件之间的耦合性。
类似于门卫传达室,一个请求来的时候先去门卫,一步步来处理问题,就是个servlet。
HandlerMapping:处理器映射器
HandleMapping负责根据用户请求url找到Handler处理器,springmvc提供了不同的映射器实现不同的
映射方式,如配置文件方式,实现接口的方式,注解方式。
实际上,就是Map,放了一堆数据,key是url,value是你对应的处理器,一个请求来了,嗲用
map.get(url)就知道是哪个类的哪个方法来处理这个请求,实际上将这个url对应的拦截器,处理器
都拿到。
HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这里适配器模式的应用,通过扩展适配器可以对更多类型的的
处理器进行执行。
实际上,这货会调用对应的方法,生成最终的ModelAndView。
ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver根据逻辑视图名解析成物理视图名即具体的
页面的地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给客户。
实际上就是解析ModelandView,拼接字符串,给你加个前缀,再加个后缀,让你能够找到对应的
视图地址。(很少用)
创建SpringMVC项目(配置版)
--用Maven创建项目,pom.xml修改打包方式为war包
<!-- 修改打包方式为war -->
<packaging>war</packaging>
--添加spring-webmvc依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.22</version>
</dependency>
</dependencies>
--添加servlet依赖
因为springmvc底层还是servlet,所以还必须添加serlvet依赖。
<!-- servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
--添加jsp
<!-- jsp -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
--web.xml配置欢迎页
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
<welcome-file>login.html</welcome-file>
</welcome-file-list>
--想用SpringMVC,需要注册dispatcherServlet
<!-- 如果想要使用SpringMVC,就必须注册dispatcherServlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 加载springmvc的配置文件 -->
<!--
springmvc的默认配置文件的扫描路径和文件名:
1、默认的路径:WEB-INF/
2、默认的文件名: <servlet-name>-servlet.xml
放在resource下
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:app-context.xml</param-value>
</init-param>
<!-- 启动web容器就加载springmvc -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
--app-context.xml
<!-- 中央适配器:DispatcherServlet -->
<!-- 处理映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<!-- WEB-INF下加密路径,请求转发 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
--创建Controller
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class UsrControllers implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
// 视图,页面,视图名,视图解析器
modelAndView.setViewName("success");
// 设置一个模型,往request作用域中添加数据,获取的话要用jsp
modelAndView.addObject("username","admin");
return modelAndView;
}
}
--index.jsp
<h1>Hello SpringMVC!!!</h1>
<a href="user">UserController</a>
<br>
<a href="user/showUser">showUser</a>
<form action="user/login" method="post">
<p>
账号:<input type="text" name="username">
</p>
<p>
密码:<input type="password" name="password">
</p>
<p>
<input type="submit" value="提交">
</p>
</form>
--WEB-INF下创建pages文件夹,创建success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>Success Page!!!</h1>
welcome:${requestScope.username}
<hr>
用户名:${requestScope.user.username}
密码:${requestScope.user.password}
<hr>
从session中获取的用户名:${sessionScope.username}
</body>
</html>
--注册Controller
<!-- 注册UserController -->
<bean id="/user" class="com.jsoft.controller.UserController"></bean>
SpringMVC项目(注解版)
--springmvc配置文件开启文件扫描
<!-- 开启spring注解扫描:Controller,service -->
<context:component-scan base-package="com.jsoft"></context:component-scan>
<!-- 开启springmvc的注解扫描 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 中央适配器:DispatcherServlet -->
<!-- 处理映射器 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<!-- WEB-INF下加密路径,请求转发 -->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!-- 后缀 -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 注册UserController -->
<!-- <bean id="/user" class="com.jsoft.controller.UserController"></bean>-->
--Controller
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Controller
public class UsrControllers {
// 设置处理那个请求,springmvc的注解
@RequestMapping("/user")
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();
// 视图,页面,视图名,视图解析器
modelAndView.setViewName("success");
// 设置一个模型,往request作用域中添加数据,获取的话要用jsp
modelAndView.addObject("username","admin");
return modelAndView;
}
}
--视图和模型:不应该放在一块。
* 视图和模型都耦合给了ModelAndView对象,必须说我只想跳视图。
*
* 模型和视图分离!!!
@Controller
@RequestMapping("user")
public class UsrControllers {
@RequestMapping(value = "showUser",method = RequestMethod.GET)
//@RequestMapping(value = "?howUser",method = RequestMethod.GET)
//@RequestMapping(value = "*howUser",method = RequestMethod.GET)
// @GetMapping("showUser")
public String showUser(Model model) {
// 操作模型,把数据添加到request作用域
model.addAttribute("username","张三");
// 操作视图
return "success";
}
}
<h1>Hello SpringMVC!!!</h1>
<a href="user">UserController</a>
<br>
<a href="user/showUser">showUser</a>
--配置字符集
<!-- 注册springmvc自带的字符集的过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
标签:22,SpringMVC,09,视图,--,Controller,ModelAndView,servlet From: https://www.cnblogs.com/shenmimao/p/16720931.html