目录
SpringMVC入门
SpringMVC核心组件
- DispatcherServlet前置控制器
基于XML配置的使用
大致步骤
- spring mvc 基础配置
- xml配置Controller,HandlerMapping组件映射
xml配置ViewResolver组件映射
- 在xml中注册前置控制器,并标注springmvc的主配置文件路径(之后写)
- 编写一个Handler
编写springmvc主配置文件,并在里面注册Handler,再将一些路径的访问和Handler绑定
- 首先在web.xml配置前置控制器(以Servlet形式),并同时将根路径方法映射到该控制器,也就是所有访问都要先直接通过前置控制器
<web-app>
<display-name>Archetype Created Web Application</display-name>
<!-- 配置前置控制器 -->
<servlet>
<servlet-name>springMVCTest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 这里定义其配置文件路径属性,在其初始化时就设定 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<!-- 稍后在resources目录中创建springMVCCofing.xml作为配置文件 -->
<param-value>classpath:springMVCCofing.xml</param-value>
</init-param>
</servlet>
<!-- 将所有访问映射到前置控制器 -->
<servlet-mapping>
<servlet-name>springMVCTest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 定义Handler
//实现Controller接口
public class HandlerTest implements Controller {
//实现其handleRequest方法,要求返回一个ModelAndView对象
@Override
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//直接创建MAV对象
ModelAndView mav=new ModelAndView();
//装载模型数据,SpringMVC会自动将其挂载到request域中
mav.addObject("message","hello,world");
//设定逻辑视图
mav.setViewName("test");
return mav;
}
}
- 然后再到
springMVCCofing.xml
,定义Handler的Bean对象,再定义HandlerMapping对象用于设定一个路径和Handler对象产生映射关系,再定义一个视图解析器用于将Handler的ModelAndView中产生的逻辑视图解析传给对应JSP页面
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="getHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--将对"/test"的访问转发给id等于getHandler的Bean-->
<prop key="/test">getHandler</prop>
</props>
</property>
</bean>
<!-- 注册Handler的bean -->
<bean id="getHandler" class="com.test.springmvctest.HandlerTest"></bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的两个属性分别为前缀后缀,给逻辑视图包裹成/<逻辑视图名称>.jsp -->
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
- 最后在JSP中访问request域中的值
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 开启EL语言 -->
<%@ page isELIgnored="false"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<!--访问request域中的key等于message的值-->
${message}
</body>
</html>
基于注解的使用
与基于XML使用的不同在于,根据不需要在springmvc配置文件注册Handler和HandlerMapping了,Handler也不需要实现Controller接口了
只有springMVCCofing.xml和HandlerTest.java不同
springMVCCofing.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.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="com.test.springmvctest"/>
<!-- 逻辑视图解析器还是要的 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
HandlerTest.java
// 标记为Handler
@Controller
public class HandlerTest{
//绑定特定访问路径
@RequestMapping("/test")
public ModelAndView getMAV(){
ModelAndView mav=new ModelAndView();
mav.addObject("message","hello,world");
mav.setViewName("test");
return mav;
}
}
同时基于注解还有两种方式可以实现MAV功能
//绑定特定访问路径
@RequestMapping("/methodA")
// 这里的model直接以Model形式接受和挂载数据
public String MethodA(Model model){
// 往Model对象中挂载模型数据
model.addAttribute("message","hello,world");
//返回以String形式逻辑视图
return "test";
}
//绑定特定访问路径
@RequestMapping("/methodB")
// 这里的model以Map形式接受和挂载数据
public String MethodB(Map<String,String> mapAsModel{
// 往Model对象中挂载模型数据
mapAsModel.put("message","hello,world");
//返回以String形式逻辑视图
return "test";
}