HelloWorld总结
一、导包
Spring模块的包
- commons-logging-1.2.jar
- spring-aop-5.0.0.RELEASE.jar //注解包
- spring-expression-5.0.0.RELEASE.jar
- spring-core-5.0.0.RELEASE.jar
- spring-context-5.0.0.RELEASE.jar
- spring-beans-5.0.0.RELEASE.jar
SpringMVC模块包
- spring-webmvc-5.0.0.RELEASE.jar
- spring-web-5.0.0.RELEASE.jar
二、写配置
在web.xml文件下配置DispatcherServlet
<?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">
<!--SpringMVC思想:前端控制器拦截所有请求并派发-->
<!--DispatcherServlet本质是一个Servlet-->
<!--
https://blog.csdn.net/qq_44486437/article/details/108149847
回顾Servlet如何配置
-->
<!--构建映射-->
<servlet>
<!--Servlet的名字-->
<servlet-name>springDispatcherServlet</servlet-name>
<!--Servlet对应的全类名-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--指定SpringMVC配置文件位置-->
<param-name>contextConfigLocation</param-name>
<!--classpath: 类路径-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!--
servlet启动加载:服务器启动时加载
默认是第一次访问时才创建对象
<load-on-startup>值越小,优先级越高
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!--Servlet的名字-->
<servlet-name>springDispatcherServlet</servlet-name>
<!--Servlet对应的资源路径,即请求路径-->
<!--
/*和/都是拦截所有请求
/*的范围更大,还会拦截到*.jps这些请求
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
创建springmvc.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--扫描所有组件-->
<context:component-scan base-package="pers.lele.controller"></context:component-scan>
</beans>
三、写实例代码
java代码
package pers.lele.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//表示组件是控制器
@Controller
public class MyFirstController {
// 处理hello请求
@RequestMapping("/hello")
public String myFirstRequest() {
System.out.println("请求收到了");
return "/WEB-INF/pages/success.jsp";
}
}
前端代码
<%--
Created by IntelliJ IDEA.
User: ASUS
Date: 2021/2/15
Time: 11:16
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>
<a href="hello">HelloWorld</a>
</body>
</html>
视图解析器的配置
在springmvc.xml文件中加入如下配置
<!-- 配置视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--注意 /WEB-INF/pages/ 的写法 拼串-->
<!--前缀-->
<property name="prefix" value="/WEB-INF/pages/"></property>
<!--后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
不要把视图解析器想的多么高大上,目前的作用仅仅是拼接字符串用,正如下面这样
//表示组件是控制器
@Controller
public class MyFirstController {
// 处理hello请求
@RequestMapping("/hello")
public String myFirstRequest() {
System.out.println("请求收到了");
// return "/WEB-INF/pages/success.jsp";
// 因为配置了视图解析器 自动拼串
return "success";
}
}
相当于"/WEB-INF/pages/"+success+".jsp"
注意
当访问404时,可以将该项目的包删除,在重新打包部署
如果不指定springmvc的配置文件
java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/springDispatcherServlet-servlet.xml]
则在/WEB-INF下创建一个 前端控制器名-servlet.xml文件,web.xml文件中以下内容则可以不写
<init-param>
<!--指定SpringMVC配置文件位置-->
<param-name>contextConfigLocation</param-name>
<!--classpath: 类路径-->
<param-value>classpath:springmvc.xml</param-value>
</init-param>
url-pattern细节
在Tomcat的web.xml文件中发现
<!-- The default servlet for all web applications, that serves static -->
<!-- resources. It processes all requests that are not mapped to other -->
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
default servlet 服务于静态资源(除了jsp与servlet以外的均是静态资源)
<!-- The JSP page compiler and execution servlet, which is the mechanism -->
<!-- used by Tomcat to support JSP pages. Traditionally, this servlet -->
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
JspServlet 编译执行.jsp文件
所有项目的小web.xml都是继承自大web.xml文件(Tomcat的web.xml文件)
那么相当于前端控制器的/禁用了tomcat服务器中default servlet的/(子类覆盖父类)
为什么jsp又能访问,因为没有拦截服务器中JspServlet的配置
/* 直接拦截所有请求,不会被覆盖,迎合Rest风格的URL地址
了解MVC与SpringMVC