spring mvc学习-狂神说-day01
SpringMVC:模型:(dao/service)、视图(JSP),控制器(Controller)
- dao
- service
- sevlet:转发,重定向
- jsp/html
为什么要学springMVC
- 轻量级、简单易学
- 高效,基于请求响应的MVC架构
- 与spring兼容性好,无缝结合
- 约定优于配置
- 功能强大,RESTful,数据验证,格式化、本地化,主题等
- 简结灵活
SpringMVC框架像其它MVC框架一样,以请求为驱动,围绕一个中心Servlet分派请求及提供其它功能,DispatcherServlet是一个实际的Servlet,如下图所分析:
Springmvc的原理如下图所示:
当发起请求时,被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,
控制器使用模型与视图渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者
基于spring的方式来说明springmvc原理项目:
创建一个项目模块
将项目模块设置为Web项目,右键项目,添加框架支持,选择web
在web.xml文档中配置以下内容,加入
<!-- 配置springmvc的DispatchServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 设置spring的配置文件--> <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>
在类目录下创建spring的配置文件springmvc-servlet.xml,内容以下:增加了三个bean,这是springmvc的核心bean
<!-- 配置映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean> <!--配置适配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean>
在类目录下创建控制程序HelloController,内容以下:
package com.fengfang.controller; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @Description TODO * @Author liuxh * @Date 2020/8/28 11:44 **/ public class HelloController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //创建模型视图 ModelAndView mv = new ModelAndView(); //封装对象,放在modelAndView中 mv.addObject("msg", "helloSpringMVC"); // 封装要跳转的视图 mv.setViewName("hello"); return mv; } }
将这个Controller注册到bean中,在spring的配置文件中增加
<!-- 注册用户bean--> <bean id="/hello" class="com.fengfang.controller.HelloController"/>
在WEB-INF目录下增加jsp目录,然后添加hello.jsp文件,代码以下:
<%-- Created by IntelliJ IDEA. User: pc7 Date: 2020/8/28 Time: 11:44 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> ${msg} </body> </html>
配置tomcat服务器,并启动服务,可能会出现以下404错误:
可能遇到的问题:访问出现404,排查步骤:
1、查看控制台输出,看一下是否是缺不了什么jar包
2、如果jar包存在,显示无法输出,就在IDEA的项目发布中,添加lib依赖
(在project structure--》Artifacts-》选择待发布的项目-->在发布目录下,添加lib文件夹,然后将libraries加入进来)
3、重启tomcat即可解决
如下图:
现在针对原理进行说明
DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心,用户发出请求,DispatcherServlet接收请求并拦截请求。
我们假设请求的URL为:http://localhost:8099/springmvc/hello
如上url分拆分成三个部分
http://localhost:8099 服务器域名
springmvc部署在服务器上的web站点,即项目名
hello表示控制器
通过分析,如上URL表示为:请求位于服务器http://localhost:8099 的springmvc站点的hello控制器
使用annotation注解方式来实现springmvc
主要步骤
创建maven项目
将项目加入web框架
在IDEA的项目发布中,添加lib依赖,(在project structure--》Artifacts-》选择待发布的项目-->在发布目录下,添加lib文件夹,然后将libraries加入进来),否则会出现404错误
在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"> <!-- 配置springmvcDispatchServlet--> <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>
在spring的配置文件中springmvc-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" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" 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"> <!-- 定义包扫描--> <context:component-scan base-package="com.fengfang.controller"></context:component-scan> <!-- 定义mvc注解支持--> <mvc:annotation-driven /> <!-- 过滤非servlet请求--> <mvc:default-servlet-handler /> <!-- 配置视图解析器--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <property name="prefix" value="/WEB-INF/pages/"/> <property name="suffix" value=".jsp"/> </bean> <!--注册Controller 这是使用实现Controller接口的方式,是比较老的方式,现在一般不用这种方式 --> <!-- <bean id="/hello" class="com.fengfang.controller.ControllerUser"/>--> </beans>
注意:这里有一个坑就是:
对于视图解析器的配置中,prefix配置的值,一定需以“/”开头,如“/WEB-INF/pages/”,否则会出现在控制器中返回路径,会出现问题,当控制器中使用父路径时,就会出现错误,如下面控制器的定义情况:
package com.fengfang.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * @Description TODO * @Author liuxh * @Date 2020/8/31 15:52 **/ @Controller @RequestMapping("/c3") public class ControllerTest3 { @RequestMapping("/test3") public String test3(Model model){ model.addAttribute("msg", "test-----3"); return "success"; } @RequestMapping("/test1") public String test1(Model model){ model.addAttribute("msg", "test------1"); return "success"; } }
在WEB-INF目录下增加存放页面的目录 如:pages文件夹,再添加控制器中需跳转返回的页面,如success.jsp页面
<%-- Created by IntelliJ IDEA. User: pc7 Date: 2020/8/31 Time: 15:04 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> <h3>success 页面</h3> ${msg} </body> </html>
撰写控制器代码
package com.fengfang.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; /** * @Description TODO * @Author liuxh * @Date 2020/8/31 15:05 **/ @Controller //代表这个类会被spring接管,被这个注解的类,中的所有方法,如果返回值是String,并且有具体的页面可以跳转,那么就会被视图解析 public class ControllerMapping { @RequestMapping("/hellomap") public String mapping(Model model) { model.addAttribute("msg", "hello this is mapping controller"); return "success"; } }
最后启动tomcat项目,并通过刚定义的路径进行访问,如下面的案例:
使用http://localhost:8080/hellomap,就可以访问页面。
Restful风格
RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。
对于在sprinmvc中提交get/post请求时,发现中文有乱码,可以在配置档中增加以下配置即可以处理这个问题
<!--配置springmvc的乱码过滤器--> <filter> <filter-name>encoding</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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
以上这个“/*”很重要,若是使用“/”则没有作用,否则会对jsp页面配置无效