SpringMVC的搭建和详细配置

Posted 肖帆咪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringMVC的搭建和详细配置相关的知识,希望对你有一定的参考价值。

创建项目

在这里插入图片描述
在这里插入图片描述

进行配置

1.pom.xml导包

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-webmvc</artifactId>
	<version>5.2.2.RELEASE</version>
</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
<dependency>
     <groupId>javax.servlet</groupId>
     <artifactId>jstl</artifactId>
     <version>1.2</version>
</dependency>

2.在webapp下的web.xml中配置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">

    <!--
        配置Spring中核心请求转发servlet
        由此servlet对请求进行拦截处理
    -->
    <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param><!--init 方法读取参数-->
            <param-name>contextConfigLocation</param-name>
            <!--读取spring文件-->
            <param-value>classpath:spring.xml</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup><!--服务器启动创建servlet对象-->
    </servlet>

    <!--请求映射-->
    <servlet-mapping>
        <servlet-name>springmvc</servlet-name>

        <!--配置所有请求都进入DispatcherServlet进行处理-->
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

3.先在java下创建包,再在resource下创建spring.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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启注解扫描-->
    <context:component-scan base-package="com.wyf.ssm"></context:component-scan>

    <!--开启springmvc注解-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

4.配置tomcat,创建controller类,并测试
在这里插入图片描述

创建loginController

package com.wyf.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(path = "/login")
public class LoginController {

    @RequestMapping(path="/toLogin")
    public ModelAndView toLogin(){
        System.out.println("toLogin");
        return null;
    }
}

5.访问页面
在这里插入图片描述
输出成功
在这里插入图片描述

配置视图解析器,通过请求跳转到相应的jsp页面

1.我们希望请求发出后跳转到一个jsp页面,在loginController写我们需要跳转的页面

package com.wyf.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(path = "/login")
public class LoginController {

    @RequestMapping(path="/toLogin")
    public ModelAndView toLogin(){
        //视图名,springmvc通过视图解析器查找jsp
        ModelAndView mv = new ModelAndView("login");
        mv.addObject("name","jim");//通过 addObject() 可以向页面传输数据
        return mv;
    }
}

2.在webapp下的WEB_INF下创建一个jsp文件夹专门存放jsp文件
在这里插入图片描述

3.创建一个springmvc.xml文件专门存放关于mvc的配置,在spring.xml中导入此文件

 <!--导入springmvc.xml-->
    <import resource="classpath:springmvc.xml"></import>
<?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:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://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/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启springmvc注解-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--配置视图解析器,这样就可以通过视图名找到对应的jsp-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"></property>
        <property name="prefix" value="/WEB-INF/jsp/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
</beans>

4.重启服务器测试
在这里插入图片描述

SpringMVC运行流程

在配置了一个简单的项目测试成功后,我们了解一下SpringMVC的运行流程
在这里插入图片描述
1.浏览器发起请求,通过地址栏(login/toLogin)发起请求,被前端请求分发器(DispatcherServlet)拦截
2.DispatcherServlet 调用HandlerMapping(映射处理器)找到处理器(控制器)将解析的结果返回给DispatcherServlet,如果配置了拦截器,还会调用拦截器
3.DispatcherServlet调用对应的控制器,在到达控制器之前,会先进入HandlerAdapter(处理适配器)参数的封装,数据类型转换
4.最终到我们自己写的控制器接收数据处理返回ModelAndView(包含视图名数据)返回给DispatcherServlet
5.DispatcherServlet将结果交给视图解析器找到对应的jsp文件
6.把Model(数据)交给 view(jsp)
7.由jsp做出最终响应

如何接收jsp发出的请求和数据

我们在进入登录页面后显示一个表单

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <form method="post" action="/ssm1/login/login">
        账号:<input type="text" name="account">
        密码:<input type="password" name="password">
        <input type="submit" value="登录">
    </form>
</body>
</html>

LoginController里添加表单请求方法

package com.wyf.ssm.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
@RequestMapping(path = "/login")
public class LoginController {

    @GetMapping(path="/toLogin")
    public ModelAndView toLogin(){
        //视图名,springmvc通过视图解析器查找jsp
        ModelAndView mv = new ModelAndView("login");
        mv.addObject("name","jim");//通过 addObject() 可以向页面传输数据
        return mv;
    }

	 /*
    * @RequestMapping(path="/login")  get请求和post请求都可以
    * @GetMapping 只适应get请求 
    * @PostMapping 只适应post请求
    * */
    @PostMapping(path="/login")
    //如何获取jsp页面传过来的数据,需要和表单中的name名必须相同
    //也可以通过框架的自动封装,将数据封装到一个对象中,先保证表单中的name与对象的属性名一致
    public ModelAndView login(String account , String password){
        ModelAndView mv = null;
        if(account.equals("admin") && password.equals("111")){
            mv = new ModelAndView("success");
            mv.addObject("account",account);
        }
        return mv;
    }
}

如果成功跳转到success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    登陆成功${account}
</body>
</html>

测试
在这里插入图片描述
成功跳转
在这里插入图片描述

添加过滤器

在登录界面添加了一张照片但是显示不出来,是为什么呢
在这里插入图片描述
因为请求都会进入DispatcherServlet进行处理
在这里插入图片描述
解决方法:在springmvc.xml中添加配置

<!--进行检测,拦截.jsp .css .js这些文件不进入DispatcherServlet-->
    <mvc:default-servlet-handler/>

解决编码问题:在web.xml中添加编码过滤器

 <!--编码过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

解决绝对路径问题:创建监听器

package com.wyf.ssm.listener;

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

/*
监听器:监听servletContext.HttpSession和ServletRequest等域对象的创建和销毁事件
servletContext:生命周期开始服务器启动,结束于服务器关闭
HttpSession:开始于会话创建,结束于1.服务器关闭  2.30分钟未操作  3.强制销毁
 ServletRequest:开始于请求,结束于服务器向客户端做出响应
 */
public class ObjectServlet implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContext context = sce.getServletContext();
        context.setAttribute("path",context.getContextPath());
    }

    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    }

}

在web.xml中配置


    <!--监听器定义绝对路径path-->
    <listener>
        <listener-class>com.wyf.ssm.listener.ObjectServlet</listener-class>
    </listener>

测试

	<img src="${path}/static/logo_bg.jpg" />

在这里插入图片描述

Ajax返回JSON

@responseBody 注解的作用是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,通常用来向异步请求返回 JSON 数据。
1.添加jar包

<dependency>
	<groupId>com.fasterxml.jackson.core</groupId>
	<artifactId>jackson-databind</artifactId>
	<version>2.9.1</version>
</dependency>

2.写一个页面已ajax的方式发送请求

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Title</title>
    <script src="${path}/static/js/jquery.1.8.3.min.js"></script>
    <script type="text/javascript">
        function save() {
            $.post("${path}/login/save", $("#formId").serialize(), function (res) {
                console.log(res);
                if (res.code == 200) {
                    alert(res.msg);
                    alert(res.data);
                    location.reload();
                } else {
                    alert(res.msg);
                }
            });
        }
    </script>
</head>
<body>
<form id="formId">
    <input type="text" name="name" id="name">
    <input type="text" name="age" id="age">
    <input type="button" value="登录" onclick="return save()">
</form>
</body>
</html>

3.在控制器写一个方法接收数据并返回结果
@ResponseBody注解标签 默认返回json格式

 @PostMapping(path = "save")
    @ResponseBody //默认返回json格式
    public Map save(String name, int age) {
        Map map = new HashMap();
        try {
            System.out.println(10/0);
           map.put("code","200");
           map.put("msg",

以上是关于SpringMVC的搭建和详细配置的主要内容,如果未能解决你的问题,请参考以下文章

SpringMVC的搭建和详细配置

[转]SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程附源代码Demo

Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建

Spirng+SpringMVC+Maven+Mybatis+MySQL项目搭建

SSM整合搭建

SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程附源代码Demo