MENU

SpringMVC -- HelloWorld 篇

June 2, 2018 • Code

前言:记录 SpringMVC 框架的初步学习过程

环境

  • Intellij IDEA 2017.3.3

  • Tomcat:8.5

  • Spring:4.0 +

  • SpringMVC:4.0+

  • JSTL:1.2

  • Servlet:4.0

web.xml 的版本:2.3(版本对之后的配置有影响)

主要过程

搭建 Maven 工程

用IDEA搭建Maven工程,并完善相关目录结构

1. 选择搭建 Maven 工程,并使用 maven-webapp 模板

2. 填写 groupId 和 ArtifactId

3. 最后 Finish

4. 默认模板目录结构不完整,所以手动补全,完整目录结构如下:

引入依赖

pom.xml 中引入相关依赖

<dependencies>
    <!-- ============Spring相关============ -->
    <!-- Spring-Context -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- Spring-AOP -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-aop</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- ============Spring MVC相关============ -->
    <!-- Spring-WebMVC -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- Spring-Web -->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.3.7.RELEASE</version>
    </dependency>

    <!-- ============Servlet相关============ -->
    <!-- JSTL -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <version>1.2</version>
    </dependency>

    <!-- Servlet -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.0</version>
    </dependency>
</dependencies>

编写核心类

编写核心类,在这个栗子中为 Controller 类

下面栗子中两种方式在配置文件编写及运行测试环节一一对应。

  • 注解方式
/**
 * @author: kbrx93
 */
@Controller
public class AnnotationController {

    @RequestMapping("/annotation_hello")
    public void sayHello() {
        System.out.println("AnnotationController.sayHello");
    }
}
  • 继承接口方式
/**
 * SpringMVC HelloWrold
 *
 * @Author: kbrx93
 */
public class HelloWorldController implements Controller{

    @Override
    public ModelAndView handleRequest(
            javax.servlet.http.HttpServletRequest httpServletRequest, 
            javax.servlet.http.HttpServletResponse httpServletResponse
    ) {
        System.out.println("This is the SpringMVC Hello World example!");
        ModelAndView mv = new ModelAndView();
        mv.addObject("user", "kbrx93");
        mv.setViewName("index.jsp");
        return mv;
    }
}

编写配置文件

配置 application.xmlweb.xml 文件,主要有两种方式:注解配置文件中配置,其中注解方式更为常用

  • 注解

口诀:扫 - 驱 - 静

在文件头引入 xmlns:mvc="http://www.springframework.org/schema/mvc"http://www.springframework.org/schema/mvc

 <!-- 全注解方式配置 -->

<!-- 1. 开启扫描 -->
<context:component-scan base-package="com.kbrx93.controller"/>

<!-- 2. 引入注解驱动 -->
<!--

    不是必要条件,但最好加上。
    一句话:你的手机通信加上之后可能就由移动变成联通了,提供的服务相同,但组件不同。
    并且相对来说更加可控

 -->
<mvc:annotation-driven/>

<!-- 3. 静态资源处理 Servlet(因为拦截“/”覆盖掉原本的 Tomcat 中处理静态资源的 Servlet) -->
<mvc:default-servlet-handler/>
  • 对应接口方式
<!-- name属性即为访问的路径 -->
<bean name="/hello" class="com.kbrx93.controller.hello.HelloWorldController"></bean>

运行测试

编写JSP,运行Tomcat进行测试

  • /webapp/show.jsp 文件:
<%--
  Author: kbrx93
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
${user}
</body>
</html>
  • 运行Tomcat测试结果:

注解方式

接口方式

问题

记录分析遇到的问题

1. ${user} EL表达式在 JSP 中不生效

原因:主要由于 web.xml 文件中声明 xsd 版本问题,EL 解析开关只有在 2.4 及 3.1 版本中是默认打开的。

解决方法:

  • 更换声明为2.43.1版本

  • 在每一个使用到 EL 表达式的 JSP 页面开头 <%@ page %> 标签中加上 isELIgnored="false" 属性

<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>

下面列出不同声明版本模板:

  • web-app_2_2.xsd
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/dtd/web-app_2_2.dtd"> 
  • web-app_2_3.xsd
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
  • web-app_2_4.xsd
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         version="2.4" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
  • web-app_2_5.xsd
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://java.sun.com/xml/ns/javaee" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         version="2.5" 
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
         http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  • web-app_3_0.xsd
<?xml version="1.0" encoding="UTF-8"?>  
<web-app xmlns="http://java.sun.com/xml/ns/javaee"  
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          xsi:schemaLocation="http://java.sun.com/xml/ns/javaee  
          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"  
          version="3.0">  
</web-app>
  • web-app_3_1.xsd
<?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_3_1.xsd"  
         version="3.1">  
</web-app>  

2. 使用注解方式调用返回值为 null 的方法发生 404

原因:使用注解方式如果没有注入参数HttpServletResponse,那便需要返回一个模型视图对象,除非配置了视图解析器。即一定要有响应对象

3. 项目的 web.xm 文件中配置拦截 / 请求的 DispatcherServlet,后直接访问静态资源报 404 错误

原因:因为在 Tomcat 的 web.xml 中也配置了一个拦截 / 的默认 Servlet,默认静态资源由它处理,但由于后加载的项目中 web.xml 也有一个拦截 /Servlet,故被覆盖了。然而静态资源在 SpringMVC 项目中并没有进行相关的配置,故 404

解决方法:配置文件 application.xml 中引入 <mvc:default-servlet-handler/>,将静态资源交由 SpringMVC 的默认 Servlet 处理。

小结

主要过程有:

  1. IDEA 搭建 Maven 工程,并完善目录结构

  2. pom.xml 中引入相关依赖

  3. 编写核心类,在这个栗子中为 Controller 类

  4. 配置 application.xmlweb.xml 文件,主要有两种方式:注解配置文件中配置,其中注解方式更为常用

  5. 编写JSP,运行Tomcat进行测试

Last Modified: July 12, 2018
Archives QR Code
QR Code for this page
Tipping QR Code