第一个SpringMVC程序
新建Maven工程
使用骨架创建webapp
即可的。
添加依赖
主要包括:spring-webmvc
, jsp
, servlet
。
<!-- SpringMVC Jar -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
注册中央调度器
<?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">
<!--
中央调度器
注意将其设置为Tomcat启动后就创建Dispatcher实例,
因为其负责SpringMVC容器的创建, 其读取配置文件, 并将配置文件当中的内容创建完毕。
servlet 会在 init方法中执行下面的代码 :
// 创建容器,读取配置文件
WebApplicationContext ctx = new ClassPathXMLApplicationContext("springMVC.xml")
// 将容器对象放入到servletContext中
getServletContext.setAttribute(ctx);
-->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<!-- 指定SpringMVC配置文件放置的位置 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<!--
自定义扩展名方式 : *.do, *.action, *.mvc
http://localhost:8080/myweb/some.do
使用 "/"的方式
-->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
创建SpringMVC配置
其路径为resources/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: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="contorller"></context:component-scan>
</beans>
创建视图 和 视图解析器
创建视图就是创建JSP
页面,用于测试向Controller
发送请求。
- webapp/index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head> <title>Title</title> </head>
<body>
<p>第一个MVC的项目</p>
<p><a href="some.do">发起some.do的请求</a></p>
</body>
</html>
- webapp/WEB-INF/view/show.jsp
将jsp
放置到WEB-INF
是为了不让用户直接从浏览器当中访问到这个页面,而是通过内部的请求转发方式。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<!-- 从request域当中获取数据 -->
<p>${msg}</p>
<p>${date}</p>
</body>
</html>
- 视图解析器
其目的是为了简化ModelAndView
对于视图的书写,我们只用书写视图的逻辑名称,而真正的路径交给视图解析器生成并处理。
<!-- resouces/springmvc.xml -->
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 :视图文件的路径 -->
<property name="prefix" value="/WEB-INF/view/"></property>
<!-- 后缀 : 视图文件的扩展名 -->
<property name="suffix" value=".jsp"></property>
</bean>
创建控制器类
@Controller
为IOC
的注解,在配置Spring
指定配置组件扫描,可以将有此注解的类全部创建到容器当中。
@RequestMapping
可以放在类上也可以放在方法上,放在类上代表一个模块儿,放在方法上代表资源路径。其value表示路径名称。
返回值ModelAndView
代表的是视图和数据的封装,在后面会讲Controller
的返回类型。这里只用知道其会将数据转发到指定的视图上面即可。
package contorller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.Date;
@Controller
public class MyController {
@RequestMapping("/test/some.do")
public ModelAndView doSome() {
// TODO... service 处理完毕
// 填充数据 : 框架将数据放置到request作用域中。request.setAttribute(...);
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "Hello World");
mv.addObject("date", new Date().getTime());
// 指定视图 : 框架对视图执行的是 forward 操作,这里使用到了视图解析器
mv.setViewName("show");
return mv;
}
}
测试
发布项目,访问到index.jsp
, 点击页面中的链接(test/some.do),其会执行Controller
中匹配的方法,将msg
和date
放置到request
域中。然后请求根据试图解析器转发到webapp/WEB-INF/view/show.jsp
中,将数据渲染到JSP
页面上。