SpringMVC环境搭建(非注解与注解)
SpringMVC执行过程:
【非注解】
一、导入相应的包:(咋这用不到依赖包,都是后面会用到,今天做一个SpringMVC框架的基本环境搭建)
spring-beans.jar
spring-context.jar
spring-core.jar
spring-expression.jar
spring-aop.jar
spring-web.jar
spring-webmvc.jar
需要导入依赖包:
commons-logging-1.1.3.jar
aopalliance-1.0.jar
aspectjweaver-1.8.0.M1.jar
二、前面大家了解了SpringMVC的执行过程,那么它的环境我们也是根据它的流程来配置的,首先用户发起请求DispatcherServlet(前端控制器)接受,那么我们这里就需要一个DispatcherServlet
web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>Environment</display-name>
<!-- 1.前端控制器:负责接收请求与响应结果 -->
<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置springMVC的核心配置文件路径spring-mvc.xml -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 欢迎首页 -->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
三、DispatcherServlet接收到请求后,将请求的RUL交给了我们的处理器映射器(HandlerMapping),它负责根据请求的URL查找指定的处理器,那我们是不是该写处理器了?也就是在第二步中我们初始化了一个spring-mvc.xml的文件中编写,跟着这个思路走,代码如下:
spring-mvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!--
2.【非注解】处理器映射器:负责根据请求的url查找指定的处理器
-->
<!-- 方式一:BeanNameUrlHandlerMapping 根据用户请求的url匹配bean的name属性值 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<!-- 方式二:SimpleUrlHandlerMapping 根据用户请求的URL匹配bean的ID属性值,属于方式一的增强版,可以与方式一共存 -->
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/hello2.action">controller</prop>
<prop key="/hello3.action">controller2</prop>
</props>
</property>
</bean>
<!-- 3.处理器 -->
<bean id="controller" name="/hello.action" class="com.Environment.Controller.Controller"></bean>
<bean id="controller2" class="com.Environment.Controller.Controller2"></bean>
<!-- 4.【非注解】处理器适配器:负责适配执行处理器-->
<!-- 方式一:SimpleControllerHandlerAdapter,适配执行所有实现了org.springframework.web.servlet.mvc.Controller接口的类 -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"></bean>
<!-- 方式二:HttpRequestHandlerAdapter,适配执行所有实现了HttpRequestHandlerAdapter接口的类 -->
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"></bean>
<!-- 5.视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
四、只有这里面的处理器是我们自己编写的,处理器里面的bean的name要与你后面jsp测试的路径一样。我们来看,我们的controller这个类,它实现了COntroller这个接口,因为我们的处理器适配器,SimpleControllerHandlerAdapter,适配执行所有实现了org.springframework.web.servlet.mvc.Controller接口的类,它里面可以存值、跳转等。
Controller:
package com.Environment.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
public class Controller implements org.springframework.web.servlet.mvc.Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
ModelAndView mav = new ModelAndView();
//1.相当于equest.setAttribute("message","恭喜你迟到了"....."");
mav.addObject("message", "恭喜你迟到了.....");
//2.相当于equest.getRequestDispather("/main.jsp").forward(request,response);
mav.setViewName("/main.jsp");
return mav;
}
}
Controller2:
package com.Environment.Controller;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
public class Controller2 implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.相当于实现Controller接口中的mav.addObject("message", "恭喜你迟到了....."),当然我们在servlet中也学过了。
request.setAttribute("message", "恭喜你迟到了.....");
//2.相当于实现了Controller接口中的:mav.setViewName("/main.jsp");也是跟我们response的用法一样
request.getRequestDispatcher("/main.jsp").forward(request, response);
}
}
随后我写了两个测试的jsp:
index.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>
<h1>测试处理器映射器</h1>
<a href="hello.action">BeanNameUrlHandlerMapping</a><br><br>
<a href="hello2.action">SimpleUrlHandlerMapping</a><br><br>
<h1>测试处理器适配器</h1>
<a href="hello.action">SimpleControllerHandlerAdapter</a><br><br>
<a href="hello3.action">HttpRequestHandlerAdapter</a>
</body>
</html>
main.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>
${message}
</body>
</html>
SimpleUrlHandlerMapping处理器映射器的部分源码:
【注解】
一、jar包与上面非注解的一样,主要是它的处理器映射器(HandlerMapping)、处理器适配器(Handler Adapter)使用了注解,那么配置注解就在它需要处理的类中,也就是HelloController中,请代码
spring-mvc.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!-- 2.【注解】处理器映射器:负责根据请求的url查找指定的处理器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>
<!-- 3.处理器 -->
<bean id="controller" class="com.Environment.Controller.HelloController"></bean>
<!-- 4.【注解】处理器适配器:负责适配执行处理器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>
<!-- 5.视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>
HelloController:
package com.Environment.Controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class HelloController {
@RequestMapping("/hello.action")
public ModelAndView helloController () {
ModelAndView mav = new ModelAndView();
//1.相当于request.setAttribute("message","恭喜你迟到了111"....."");
mav.addObject("message", "恭喜你迟到了111.....");
//2.相当于request.getRequestDispather("/main.jsp").forward(request,response);
mav.setViewName("/main.jsp");
return mav;
}
@RequestMapping("/hello2.action")
public ModelAndView helloController2 () {
ModelAndView mav = new ModelAndView();
//1.相当于request.setAttribute("message","恭喜你迟到了22222"....."");
mav.addObject("message", "恭喜你迟到了22222.....");
//2.相当于request.getRequestDispather("/main.jsp").forward(request,response);
mav.setViewName("/main.jsp");
return mav;
}
}
二、web.xml跟非注解一样,配置一个前端控制器(DispatcherServlet)和servlet路径、初始化springmvc的核心配置文件路径spring-mvc.xml
三、测试的jsp
index.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>
<h1>测试注解SpringMVC环境</h1>
<a href="hello.action">我是第一个helloController</a><br><br>
<a href="hello2.action">我是第二个helloController</a><br><br>
</body>
</html>
main.jsp:跟非注解的一样,用EL表达式获取之前存在Request中的数据
【优化版:也是推荐版】
spring-mvc.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd">
<!-- 用于替换2、4同时开启注解方式的处理器映射器与处理器适配器-->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 用于替换3我们使用的是Spring中的自动扫描,不用在声明bean了,还可以配合SpringMVC使用因为它的注解里面有一个@COntroller-->
<context:component-scan base-package="com.Environment.Controller"></context:component-scan>
<!-- 5.视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"></bean>
</beans>