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页面配置无效

posted @ 2020-09-03 15:52  aaron616  阅读(24)  评论(0)    收藏  举报