springmvc不使用注解的配置

springmvc框架

springmvc是spring框架的一个模块,springmvc和spring无需通过中间整合层进行整合。
springmvc是一个基于mvc的web框架。
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面

springmvc工作流程

在这里插入图片描述

  1. 发送请求到DispatcherServlet(前端控制器)
  2. DispatcherServlet调用HandlerMapping查找 Handler,可以根据xml配置、注解进行查找
  3. HandlerMapping向DispatcherServlet返回一个处理器执行链,处理器执行链HandlerExecutionChain,HandlerExecutionChain中包括拦截器HandlerInceptor,Handler(处理器)
  4. DispatcherServlet将处理器执行链HandlerExecutionChain交给处理器适配器HandlerAdapter
  5. 处理器适配器HandlerAdapter去执行Handler(处理器)
  6. Handler(处理器)返回ModelAndView( 模型和视图)
  7. 处理器适配器HandlerAdapter将ModelAndView( 模型和视图)返回给DispatcherServlet
  8. DispatcherServlet调用ViewResolver(视图解析器)
  9. ViewResolver(视图解析器)返回处理后的view
  10. DispatcherServlet进行视图渲染,视图渲染将模型数据(在ModelAndView对象中)填充到request域
  11. 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,系统运行效果图和
上面的项目运行成功视图是一样的

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring MVC中,拦截器是一种非常用的机制,它可以在请求到达控制器之前或之后进行一些处理。通过使用注解配置,可以方便地定义和配置拦截器。 首先,需要创建一个类来实现HandlerInterceptor接口,并重写其中的方法。常用的方法包括preHandle、postHandle和afterCompletion。preHandle方法在请求到达控制器之前执行,postHandle方法在控制器处理完请求后执行,afterCompletion方法在视图渲染完毕后执行。 接下来,使用注解配置拦截器。可以使用@Interceptor注解将拦截器类标记为一个拦截器,并使用@Order注解指定拦截器的执行顺序。@Order注解中的值越小,优先级越高。 最后,在配置类中使用@EnableWebMvc注解启用Spring MVC,并重写addInterceptors方法来添加拦截器。可以使用registry.addInterceptor方法将拦截器添加到拦截器链中,并指定需要拦截的路径。 下面是一个示例代码: ```java import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); } private class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求到达控制器之前执行的逻辑 return true; // 返回true表示继续执行后续的拦截器和控制器 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在控制器处理完请求后执行的逻辑 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在视图渲染完毕后执行的逻辑 } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值