Spring MVC实现一个控制器写多个方法(注解方式、继承方式)

Spring MVC的API:

DispatcherServlet:         整个Spring MVC的前端控制器,由它来接管来自客户端的请求

HandlerMapping:           DispatcherServlet会通过它来处理客户端请求到各个(Controller)处理器的映射

HandlerAdapter:            HandlerMapping会根据它来调用Controller里需要被执行的方法

HandlerExceptionResolver:    spring mvc处理流程中,如果有异常抛出,会交给它来进行异常处理

ViewResolver:              HandlerAdapter会把Controller中调用返回值最终包装成ModelAndView,ViewResolver会检查其中的view,如果view是一个字符串,它就负责处理这个字符串并返回一个真正的View,如果view是一个真正的View则不会交给它处理,为什么view即可以是字符串又会是View呢下面会进行解释

View:                         对应MVC 中的V, 此接口只有一个方法 render,用于视图展现

ModelAndView             对于解决上面介绍ViewResoler或者下面图片的疑惑,这个类中的view这个属性是 Object 类型的,它可以是一个视图名也可以是一个实际的View,这点我们观察其源码可以很清楚的看出来

Spring MVC流程:

1.通过DispatcherServlet拦截用户请求

2.DispatcherServlet从HandlerMapping映射中获取用户请求是到哪个Controller,并把结果返回到DispatcherServlet中

3.请求到达Controller后,执行相关业务,返回ModelAndView到DispatcherServlet中

4.根据ModelAndView从ViewResolver中找到需要显示的View,并返回到DispatcherServlet中

5.DispatcherServlet把View响应到用户端

Spring MVC的简单实现:

web.xml的相关配置

<servlet>
	<servlet-name>springServlet</servlet-name>
	<!-- Spring MVC的核心控制器(前端控制器)拦截用户的请求 -->
	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
	<!-- 开启服务时初始化,创建相应的Bean -->
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:applicationContext.xml</param-value>
	</init-param>
</servlet>
<servlet-mapping>
	<servlet-name>springServlet</servlet-name>
	<url-pattern>*.do</url-pattern>
</servlet-mapping>

创建自己的Controller(后端控制器),继承AbstractController并实现handleRequestInternal方法

public class LoginAction extends AbstractController {
	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
}

applicationContext.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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置controller的业务Bean -->
<bean id="loginAction" class="com.web.action.LoginAction">
</bean>
<!-- 配置url与controller的映射关系 -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="mappings">
		<props>
			<prop key="/login.do">loginAction</prop>
		</props>
	</property>
</bean>
<!-- 配置视图View(已jsp作为视图) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/"/>
	<property name="suffix" value=".jsp"/>
</bean>
</beans>

现在如果用户发送/login.do的请求,请求就会到达LoginAction中进行处理,以及响应客户端

用以上的相关配置有一点不好的地方就是,用户的每个请求都需要用一个Controller来处理,要怎么样才能实现一个Controller中写多个处理方法接受用户不同的请求呢?有以下两种方式:

方式一:继承
Controller不再继承AbstractController类,现在继承MultiActionController类来实现多方法,处理方式如下

web.xml的相关配置不变,需要重写LoginAction这个Controller类

package com.web.action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;

/**
 * 继承AbstractController只能实现一个动作对应一个方法
 * 继承MultiActionController实现一个controller中写多个方法
 * @author Administrator
 *
 */
public class LoginAction extends MultiActionController {
	
	private String fromView;
	private String toView;
	
	/**
	 * 
	 * 处理方法的访问修饰符只能为public
	 * @param request
	 * @param response
	 * @return
	 * @throws Exception
	 */
	public ModelAndView getList(HttpServletRequest request, HttpServletResponse response) throws Exception {
		request.setAttribute("list", "执行getList方法成功");
		return new ModelAndView(toView);
	}
	
	public ModelAndView doLogin(HttpServletRequest request,
			HttpServletResponse response) throws Exception {
		//获取表单数据
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//调用业务逻辑方法
		String result = login(username, password);
		if("success".equals(result)){
			request.setAttribute("result", "成功");
			return new ModelAndView(toView);
		}else{
			request.setAttribute("result", "失敗");
			return new ModelAndView(fromView);
		}
	}
	
	private String login(String username, String password){
		if("123".equals(username) && "admin".equals(password)){
			return "success";
		}
		return "fail";
	}

	public String getFromView() {
		return fromView;
	}

	public void setFromView(String fromView) {
		this.fromView = fromView;
	}

	public String getToView() {
		return toView;
	}

	public void setToView(String toView) {
		this.toView = toView;
	}
}

applicationContext.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:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- 配置methodNameResolver -->
<bean id="ParameterMethodNameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
	<property name="paramName" value="action"/>
</bean>
<!-- 配置controller的业务Bean -->
<bean id="loginAction" class="com.web.action.LoginAction">
	<!-- controller继承MultiActionController并添加这个配置,使controller能写多个方法 -->
	<property name="methodNameResolver" ref="ParameterMethodNameResolver"/>
	<!-- 初始化属性 -->
	<property name="fromView" value="login"/>
	<property name="toView" value="index"/>
</bean>
<!-- 配置url与controller的映射关系 -->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
	<property name="mappings">
		<props>
			<prop key="/login.do">loginAction</prop>
		</props>
	</property>
</bean>

<!-- 配置视图View(已jsp作为视图) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<!-- 前缀 -->
	<property name="prefix" value="/"/>
	<!-- 后缀 -->
	<property name="suffix" value=".jsp"/>
</bean>
</beans>

用户发送请求/login.do?action=doLogin或者/login.do?action=getList就会执行相应的处理方法了,这样就可以访问了

方式二:注解

web.xml的相关配置不变,需要重写LoginAction这个Controller类

业务类UserService:添加注解@Service

package com.service;

import org.springframework.stereotype.Service;

/**
 * 业务类(M)
 * @author Administrator
 *
 */
@Service
public class UserService {
	
	public String login(String username, String password){
		if("123".equals(username) && "admin".equals(password)){
			return "登录成功";
		}
		return "登录失败";
	}
}

Controller类LoginAction:添加注解@Controller

package com.web.action;

import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.service.UserService;

@Controller
@RequestMapping("/login")
public class LoginAction {
	
	@Autowired
	private UserService userService;
	
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
	
	/**
	 * @param username
	 * @param password
	 * @return
	 * 返回ModelAndView,并使用map传递数据到页面
	 */
	@RequestMapping("/doLogin.do")
	public ModelAndView doLogin(String username, String password) {
		String result = userService.login(username, password);
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("result", result);
		if("登录成功".equals(result)){
			return new ModelAndView("index",map);
		}
		return new ModelAndView("login",map);
	}
	
	/**
	 * @param request
	 * @return
	 * 返回String,使用request传递数据到页面
	 */
	@RequestMapping("/getList.do")
	public String getList(HttpServletRequest request){
		request.setAttribute("result", "执行GetList方法成功");
		return "/index";
	}

}

applicationContext.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:p="http://www.springframework.org/schema/p"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
	http://www.springframework.org/schema/context 
	http://www.springframework.org/schema/context/spring-context-3.0.xsd
	">
<!-- 自动扫描路径下的所有文件,并根据注解完成注入的工作 -->  
<context:component-scan base-package="com.service,com.web.action"/>

<!-- 默认的注解映射的支持 --> 
<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

 
<!-- 使spring支持注解 -->
<context:annotation-config/>

<!-- 配置视图View(已jsp作为视图) -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<property name="prefix" value="/" />
	<property name="suffix" value=".jsp" />
</bean>


</beans>

用户请求:

<a href="login/getList.do">点击获取List</a>

<form action="login/doLogin.do" method="post"></form>,访问成功。

但是存在以下疑点:

在applicationContext.xml配置中,我删除以下配置仍可正常运行...

<!-- 默认的注解映射的支持 --> 
<mvc:annotation-driven/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
<!-- 启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> 
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

 
<!-- 使spring支持注解 -->
<context:annotation-config/>

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,以下是一些2023年Java面试题和学习计划建议: Java面试题: 1. 什么是Java虚拟机(JVM)?JVM的组成部分是什么? 2. 什么是Java中的反射?反射的优缺点是什么? 3. 什么是Java中的注解?它们有哪些用途? 4. 什么是Java中的Lambda表达式?如何使用它们? 5. 什么是Java中的异常处理?Java中有哪些类型的异常? 6. 什么是Java中的多线程?如何创建和控制线程? 7. 什么是Java中的集合框架?Java中有哪些集合类? 8. 什么是Java中的IO和NIO?它们有什么区别? 9. 什么是Java中的泛型?如何使用它们? 10. 什么是Java中的类加载器?它们有哪些类型? 学习计划建议: 1. 学习Java基础知识,包括语法、数据类型、运算符等。 2. 深入了解Java中的面向对象编程思想,掌握类、对象、继承、多态等概念。 3. 学习Java中的集合框架,包括List、Set、Map等集合类的使用。 4. 学习Java中的异常处理机制,掌握try-catch-finally结构以及自定义异常的使用。 5. 学习Java中的多线程编程,包括线程的创建、启动、等待和同步等概念。 6. 学习Java中的IO和NIO编程,包括文件读、网络编程等。 7. 学习Java中的反射和注解机制,了解它们的作用和使用方法。 8. 学习Java中的Lambda表达式和函数式编程思想,掌握Lambda表达式的语法和使用方法。 9. 学习Java中的泛型编程,包括泛型类和泛型方法的使用。 10. 学习Java中的类加载机制,包括类加载器的种类、类加载的顺序等。 以上是一些建议,您可以根据自己的情况进行调整和修改。最重要的是不断练习,多做一些实际的项目或者练习题目,以提高自己的编程能力和实践经验。 ### 回答2: 2023年的Java面试题和学习计划如下: 1. Java核心知识 - Java语言基础:变量、数据类型、运算符、控制结构等 - 面向对象编程:封装、继承、多态、抽象类、接口等 - 异常处理机制:try-catch-finally、自定义异常等 - 集合框架:List、Set、Map等常用集合操作 - IO操作:文件读、序列化等 2. Java高级特性 - 多线程和并发:线程生命周期、同步、锁机制、线程池等 - 反射和动态代理:Class类、反射调用、动态代理的概念和用法 - 泛型:泛型类型、泛型方法、通配符等 - 注解:定义和使用注解、元注解等 - Lambda表达式和函数式接口:Lambda表达式的语法和用法、函数式接口定义和使用 3. 数据库相关 - SQL语法和基本操作:增删改查、连接查询、聚合函数等 - JDBC编程:连接数据库、CRUD操作、事务管理等 - ORM框架:例如Hibernate、MyBatis的使用和原理 4. web开发相关 - Servlet和JSP:Servlet生命周期、请求响应过程、Session管理等 - Spring框架:IOC、AOP、MVC等基本概念和使用 - Spring Boot:自动配置、常用注解、项目搭建等 - RESTful API设计和使用:HTTP方法、资源定义、状态码等 学习计划如下: 1. 确定学习目标:了解面试要求和考察重点,制定合理的时间表 2. 学习基础知识:通过阅读相关教材、网上教程等掌握Java的基础语法和核心知识 3. 实践项目:通过完成一些小项目或者任务来巩固理论知识,提高编程能力 4. 阅读原理文档:深入理解Java相关的原理和机制,如JVM、多线程等 5. 练习面试题:刷题、模拟面试,提高解决问题的能力和应对压力的能力 6. 参考书籍和培训班:选择一些经典的Java开发书籍和参加培训班提高自己的学习效果 7. 学习交流:参加技术社区、技术论坛等进行学习交流,与其他Java开发者共同进步 以上是2023年Java面试题的整理和一个较为综合的学习计划,具体根据个人情况进行调整。成功的关键在于持续努力、实践和不断积累经验。祝你在2023年的Java面试中取得好成绩! ### 回答3: 2023年的Java面试题分为三个主要方面:基础知识、核心概念和高级特性。下面是一个学习计划的建议,以帮助你准备面试。 1. 基础知识: - 熟悉Java语言的基本语法、数据类型、运算符和控制流程语句。 - 理解面向对象编程的概念,包括类、对象、继承、多态和封装。 - 学习异常处理机制、输入输出流和Java集合框架。 2. 核心概念: - 理解Java内存管理机制,包括堆和栈的区别、垃圾回收和内存泄漏。 - 学习多线程编程,包括线程的创建、同步、通信和线程池的使用。 - 熟悉Java的反射机制和注解,了解它们在框架和库中的应用。 3. 高级特性: - 学习Java的网络编程,包括Socket编程、HTTP传输和RESTful服务。 - 掌握常用的设计模式,如单例模式、工厂模式和观察者模式。 - 了解Java的新特性,如Lambda表达式、Stream API和模块化系统。 学习计划建议如下: - 设定一个合理的学习时间表,每天定期进行学习,以确保学习的连续性。 - 阅读相关的Java教程和参考资料,例如官方文档和经典的Java编程书籍。 - 实践编Java代码,通过解决实际问题来加深对知识的理解和记忆。 - 参加Java开发的线上课程、培训或是参与开源项目,积累实践经验。 - 利用在线资源,如编程网站和论坛,与其他学习者交流、分享和提问。 - 制定一个自我评估计划,定期检查自己的学习进度并找出需要加强的领域。 通过系统学习和实践,逐步提升自己的Java编程能力,并不断完善面试题的准备。记住,面试并不仅仅是回答问题,还要展示自己的编程思维和解决问题的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值