springmvc不使用注解的配置
springmvc框架
springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面
springmvc工作流程
- 发送请求到DispatcherServlet(前端控制器)
- DispatcherServlet调用HandlerMapping查找 Handler,可以根据xml配置、注解进行查找
- HandlerMapping向DispatcherServlet返回一个处理器执行链,处理器执行链HandlerExecutionChain,HandlerExecutionChain中包括拦截器HandlerInceptor,Handler(处理器)
- DispatcherServlet将处理器执行链HandlerExecutionChain交给处理器适配器HandlerAdapter
- 处理器适配器HandlerAdapter去执行Handler(处理器)
- Handler(处理器)返回ModelAndView( 模型和视图)
- 处理器适配器HandlerAdapter将ModelAndView( 模型和视图)返回给DispatcherServlet
- DispatcherServlet调用ViewResolver(视图解析器)
- ViewResolver(视图解析器)返回处理后的view
- DispatcherServlet进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
- DispatcherServlet向浏览器返回相应结果
springmvc中的组件
DispatcherServlet
DispatcherServlet前端控制器,接收用户请求和响应
是springmvc工作流程的中心,它的存在存在降低了组件之间的耦合性
主要负责调度和控制流程
映射处理器HandlerMapping
HandlerMapping 是负责根据 request 请求找到对应的 Handler 处理器及 Interceptor 拦截器,将它们封装在 HandlerExecutionChain 对象中返回给前端控制器
常用的映射器处理器有如下两种
- BeanNameUrlHandlerMapping
根据请求的 url 与 Spring 容器中定义的 bean 的 name 进行匹配
Url 地址就是处理器 Bean 的名字
配置如下:
<bean class="cn.itcast.ssm.controller.ItemController"
name="/ItemController2">
</bean>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="beanName" value="/ItemController2"/>
</bean>
- SimpleUrlHandlerMapping
是 BeanNameUrlHandlerMapping 的增强版本,它可以将 url 和处理器 bean 的 id 进行统一映射配置
配置中如下:
<!-- 配置Controller(处理器),将编写Handler在spring容器加载。 -->
<bean class="cn.itcast.ssm.controller.ItemController"
id="ItemController">
</bean>
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--key:映射路径,值为Controller的id -->
<prop key="/hello.do">ItemController</prop>
</props>
</property>
</bean>
处理器适配器HandlerAdapter
- SimpleControllerHandlerAdapter
简单控制器处理适配器,不是通过springmvc注解开发的接口,HandlerAdapter必须是SimpleControllerHandlerAdapter
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用
编写的Handler实现 Controller接口
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
</bean>
- HttpRequestHandler
- 要求编写的Handler实现 HttpRequestHandler接口。
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
Handler处理器
Handler也叫做Controller
是继 DispatcherServlet 前端控制器的后端控制器
在DispatcherServlet 的控制下对用户的请求进行处理,
需要程序员根据业务进行开发
ViewResolver(视图解析器)
负责将处理结果生成 View 视图
ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址
再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
入门程序
添加springmvc依赖的jar包
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.company</groupId>
<artifactId>springdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!--junit单元测试的jar包依赖 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- springmvc 的jar包依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.4.RELEASE</version>
</dependency>
<!-- servlet的jar包依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- jsp的jar包依赖 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- jstl表达式的jar包依赖 -->
<!-- https://mvnrepository.com/artifact/jstl/jstl -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
</dependencies>
<!-- 添加tomcat插件 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>8080</port>
<hostName>localhost</hostName>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
配置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_2_5.xsd"
version="2.5">
<display-name>springdemo</display-name>
<!--springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--contextConfigLocation:配置springmvc加载的配置文件(配置映射器处理器,适配器,视图解析器,控制器 等等。
如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称-servlet.xml
(springmvc-servlet.xml) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--启动容器时初始化该 Servlet-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 第一种:*.do,访问以.do结尾由DispatcherServlet进行解析;
第二种:/,所有访问的地址都由于DispatcherServlet进行解析,对于静态文件的解析需要配置,
不让 DispatcherServlet进行解析,此种方式可以实现RestFul风格的Url -->
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
在spring-mvc.xml中配置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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-4.3.xsd ">
<!-- 映射处理器HandlerMapping,
多个映射器可以并存,前端控制器判断url能让哪些映射器映射,就让正确的映射器处理。
对 ItemController进行url映射,url就是/hello.do-->
<bean
class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!-- -->
<prop key="/hello.do">ItemController</prop>
</props>
</property>
</bean>
<!--处理器适配器 ,所有处理器适配器都实现了HandlerAdapter接口,此适配器能执行实现 Controller接口的Handler-->
<bean
class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter">
</bean>
<!-- 配置Controller(处理器),将编写Handler在spring容器加载。 -->
<bean class="cn.itcast.ssm.controller.ItemController"
id="ItemController">
</bean>
<!--视图解析器 ,解析jsp,默认使用jstl标签,classpath下得有jstl的jar包-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
Controller的开发
实体类参照
传送门
package cn.itcast.ssm.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.po.Items;
/**
*
* @author 86182
*
*/
public class ItemController implements Controller {
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
// 调用service查找 数据库,查询商品列表,这里使用静态数据模拟
List<Items> items = new ArrayList<Items>();
// 向list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
items.add(items_1);
items.add(items_2);
/*
* ModelAndView有两个常用的构造器
* ModelAndView(String viewName)
* ModelAndView(String viewName,Map data)
* 注:
* viewName:视图名
* data: 数据
*/
//返回ModelAndView
ModelAndView modelAndView=new ModelAndView();
//相当于request的setAttribute,在jsp页面中通过items获取数据
modelAndView.addObject("items",items);
//指定视图
modelAndView.setViewName("items/itemsList");
return modelAndView;
}
}
jsp页面的开发
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>查询商品列表</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/item/queryItem.do"
method="post">
<table width="100%" border="1">
<tr>
<td><input type="submit" value="查询"></td>
</tr>
</table>
商品列表:
<table width="100%" border="1">
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>生产日期</td>
<td>商品描述</td>
<td>操作</td>
</tr>
<c:forEach items="${items }" var="items">
<tr>
<td>${items.name }</td>
<td>${items.price }</td>
<td>
<!-- fmt:formatDate:jstl表达式格式化日期 --> <fmt:formatDate
value="${items.createtime }" pattern="yyyy-MM-dd HH:mm:ss" />
</td>
<td>${items.detail }</td>
<td><a
href="${pageContext.request.contextPath }/item/editItem.do?id=${items.id}">修改</a>
</td>
</tr>
</c:forEach>
</table>
</form>
</body>
</html>
部署运行
点击项目->右键鼠标,选择Run as ,选择Maven build,弹出如下窗口,在Goals输入框中输入tomcat7:run,然后点击Apply,再点击Run
控制台显示如下场景,项目启动成功!
项目结构图
项目运行成功视图
使用另一种HandlerMapping和HandlerAdapter
BeanNameUrlHandlerMapping
<!--使用Bean的name进行HandlerMapping -->
<bean class="cn.itcast.ssm.controller.ItemController"
name="/hello2.do">
</bean>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
<property name="beanName" value="/hello2.do"/>
</bean>
HttpRequestHandlerAdapter
<bean class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter"/>
修改Controller
package cn.itcast.ssm.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.handler.HandlerResolver;
import org.springframework.web.HttpRequestHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import cn.itcast.ssm.po.Items;
/**
*
* @author 86182
*
*/
public class ItemController2 implements HttpRequestHandler {
public void handleRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 调用service查找数据库,查询商品列表,这里使用静态数据模拟
List<Items> items = new ArrayList<Items>();
// 向list中填充静态数据
Items items_1 = new Items();
items_1.setName("联想笔记本1");
items_1.setPrice(6000f);
items_1.setDetail("ThinkPad T430联想笔记本电脑!");
Items items_2 = new Items();
items_2.setName("苹果手机2");
items_2.setPrice(5000f);
items_2.setDetail("iphone6苹果手机!");
items.add(items_1);
items.add(items_2);
// 设置模型数据
request.setAttribute("items", items);
// 设置请求转发
request.getRequestDispatcher("items/itemsList").forward(request, response);
}
}
系统的访问路径为:http://localhost:8080/springdemo/hello2.do,系统运行效果图和
上面的项目运行成功视图是一样的