引言
昨天有粉丝问我,Java后期应该学什么,我告诉他们应该学框架,然而对于数量庞大的框架,多数人不知道该从哪个框架入手,我个人的学习建议是:先学ssh(Struts2、Hibernate、Spring),然后学SpringMVC,Spring Data,Mybatis,Spring Boot,Spring Cloud,最后完成一些综合性的案例。当然这只是我的一些个人建议,也不一定适用于所有人,但基本的学习路线应该是这样的。
对于javaee框架部分的文章,我也是按照这样的路线写下去的。所以,在学完ssh框架之后,我们应该继续来学习一下SpringMVC。
本篇文章就是针对SpringMVC进行一个快速入门。
框架介绍
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等。
Spring是为展现层提供的基于MVC设计理念的优秀的Web框架,是目前最主流的MVC框架之一。Spring3.0之后全面超越Struts2,成为最优秀的MVC框架,SpringMVC通过一套MVC注解,让POJO成为处理请求的控制器,而无需实现任何接口。
那有人就要提出质疑了,既然SpringMVC比Struts2框架更好,更优秀,我们为什么还要学习Struts2呢?首先呢,多学点也没啥坏处,其次呢,一些公司的老项目用的应该还是Struts2,所以如果你不会Struts2也说不过去吧,最后就是如果你学过Struts2,当你学SpringMVC的时候,你将会更加地得心应手。
HelloWorld
毫无疑问,第一个入门项目当然就是HelloWorld了。
实现步骤:
- 加入jar包
- 在web.xml中配置DispatcherServlet
- 加入SpringMVC的配置文件
- 编写处理请求的处理器,并标识为处理器
- 编写视图
1.加入jar包
2.在web.xml中配置DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<display-name>SpringMVC</display-name>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>springDispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
这是一段固定的配置,如果你的开发工具有Spring插件的话,那就很容易将这段代码打出来。
点击空白处使用快捷键,然后选中dispatcherservlet,回车即可。
init-param标签配置的是初始化参数,其需要配置的参数是SpringMVC配置文件的位置和名称,学过Struts2就会知道,load-on-startup设置为1,即该Servlet是在web容器被加载的时候就创建,其它的和Struts2类似。
3.加入SpringMVC的配置文件
在src目录下创建SpringMVC的配置文件:
<?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"
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-4.0.xsd">
<!-- 配置自动扫描的包 -->
<context:component-scan base-package="com.itcast.spring"></context:component-scan>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
这些配置在Spring中已经说过了,就不再重复介绍了,实在不了解的话可以翻我之前的文章看一下。
这是SpringMVC提供的视图解析器,将控制层方法返回值解析为实际的物理视图,关于视图解析器的详细内容我会在后面的文章中详细说,这里不过多赘述。
4.编写处理请求的处理器,并标识为处理器
package com.itcast.spring.handler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloWorld {
/**
* 使用@RequestMapping注解来映射请求的URL
* 返回值会通过视图解析器解析为实际的物理视图
*
* @return
*/
@RequestMapping("/helloworld")
public String hello() {
System.out.println("hello world");
return "success";
}
}
通过@Controller将该类标记为控制器,并交由SpringIOC容器管理。
5.编写视图
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="helloworld">Hello World</a>
</body>
</html>
到这里,一个基本的案例就完成了,下面我们来详细分析一下执行流程。
首先我们访问index.jsp,该页面有一个超链接,我们通过点击超链接,会发出一个/helloworld的请求,此时在web.xml中配置的springDispatcherServlet会拦截该请求,然后SpringIOC容器会去匹配相关的控制器,因为在HelloWorld类中的hello()方法上面注解了映射请求路径@RequestMapping("/helloworld"),所以超链接发出的请求和该方法成功匹配,便会执行该方法,并返回了"success"字符串。而该返回值会通过视图解析器解析为实际的物理视图,而InternalResourceViewResolver解析器的解析规则为:prefix + returnVal + 后缀。也就是说,我们在解析器中配置的/WEB-INF/views/ 加上返回值 "success" + 后缀".jsp" 将指向物理视图(/WEB-INF/views/success.jsp)。
所以我们在WEB-INF目录下新建一个views文件夹,然后新建success.jsp文件:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h4>Success Page</h4>
</body>
</html>
通过这一系列的流程处理之后,当我们点击超链接的时候,页面会跳转至success.jsp页面,到底是不是这样的呢?运行见分晓:
其它内容
对于web.xml文件中的配置,其实也可以不用配置init-param初始化参数,而是使用默认的配置文件。但是默认的配置文件有一些讲究:
- 必须放在WEB-INF目录下
- 文件名称必须为<servlet-name> + -servlet.xml
什么意思呢?
在这里配置的servlet的名字加上-servlet.xml即为配置文件名,所以在这个项目中,配置文件名应为springDispatcherServlet-servlet.xml,因为servlet-name可以随意定义,所以其实配置文件名也可以跟着随意。