SpringMVC教程2-处理及响应请求

在这里插入图片描述

接上篇文章-SpringMVC教程1[原理分析及注解方式的使用]

一、基本操作

1.响应请求的方式

序号响应方式说明
1不响应void+@ResponseBody注解
2ModelAndView通过setViewName方法
3直接指定响应页面返回值为String类型,返回结果指定跳转地址
4重定向跳转地址前加redirect:前缀即可
5HttpServletRequest
和HttpServletResponse
形参中声明这两个变量。然后通过相关api跳转

1.1ModelAndView

	/**
	 * 查询方法
	 * @return
	 */
	@RequestMapping("/query")
	public ModelAndView query(){
		System.out.println("波波烤鸭:query");
		ModelAndView mv = new ModelAndView();
		mv.setViewName("/index.jsp");
		return mv;
	}

1.2返回void

返回值为void时,方法中可以不用做任何返回,例如下面代码:

@RequestMapping("/test1")
public void test1() {    
	System.out.println("test1");
}

此时,在浏览器端请求/test1接口,springmvc会默认去查找和方法同名的页面作为方法的视图返回。 如果确实不需要该方法返回页面,可以使用@ResponseBody注解,表示一个请求到此为止。

@RequestMapping("/test1")
@ResponseBody
public void test1() {    
   System.out.println("test1");
}

1.3返回一个字符串

返回一个真正的字符串
/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hello")
@ResponseBody
public String hello(){
	return "hello";
}

在这里插入图片描述

返回一个跳转页面名称

不需要加 @ResponseBody

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hi")
public String hello(){
	return "/index.jsp";
}

在这里插入图片描述

配置视图解析器

<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"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		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-4.3.xsd">
	
	<!-- 开启注解 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<!-- 开启扫描 -->
	<context:component-scan base-package="com.dpb.controller"></context:component-scan>
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置响应地址的前后缀 -->
		<property name="prefix" value="/user"/>
		<property name="suffix" value=".jsp"/>
	</bean>
</beans>

响应的代码:

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hello")
public String hello1(){
	// 视图解析器解析的时候会自动拼接上 /user 和  .jsp
	return "/hello";
}

在这里插入图片描述

重定向跳转

	/**
	 * 返回一个字符串
	 * @return
	 */
	@RequestMapping("/delete")
	public String delete(){
		System.out.println("波波烤鸭:删除数据操作....");
		// 重定向
		return "redirect:/user/query";
	}
	
	/**
	 * 
	 * @return
	 */
	@RequestMapping("/query")
	public String query(){
		System.out.println("波波烤鸭:query");
		
		return "/hello";
	}

在这里插入图片描述
返回路径注意: 返回的字符带"/“表示从根目录下开始找,不带”/"从当前目录下查找

1.4通过Request和Response对象处理

/**
 * HttpServletRequest和HttpServletResponse的使用
 * @return
 * @throws IOException 
 */
@RequestMapping("/query")
public void query(HttpServletRequest request,HttpServletResponse response) throws IOException{
	System.out.println("波波烤鸭:query");
	System.out.println(request);
	System.out.println(response);
	response.sendRedirect(request.getContextPath()+"/user/hello.jsp");
}

在这里插入图片描述

1.5 @RequestMapping的说明

  1. 映射路径
    是个@RequestMapping最基本的功能,用法:
    @RequestMapping("/delete")
     public String delete(){
     	System.out.println("波波烤鸭:删除数据操作....");
     	return "/hello";
     }
    
  2. 窄化请求
    窄化请求用来限定请求路径,即将@RequestMapping放在类上,这样,方法的请求路径是类上的@ReqmestMapping+方法上的@RequestMapping
    在这里插入图片描述
  3. 请求方法限定
    在这里插入图片描述在这里插入图片描述

2.参数绑定

序号类型说明
1基本数据类型直接在形参中声明
2简单对象直接在形参中声明
3包装对象通过"."处理,比如 user.name
4集合类型不能直接在形参中声明,只能在对象中使用
5数组类型可以在形参中声明,也可以在对象中使用
6Date类型需要自定义转换器

2.1基本数据类型

Java基本数据类型+String
使用基本数据类型时,参数的名称必须和浏览器传来的参数的key一致,这样才能实现自动映射

/**
 * 接收参数
 *    基本数据类型
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add")
public String add(int id,String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

在这里插入图片描述

如果参数名和浏览器传来的key不一致,可以通过@RequestParam来解决。如下

/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id,@RequestParam("username")String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

在这里插入图片描述

加了@RequestParam之后,如果未重新指定参数名,则默认的参数名依然是原本的参数名。
通过也要注意,添加了@RequestParam注解后,对应的参数默认将成为必填参数。如果没有传递相关的参数,则会抛出如下异常:

在这里插入图片描述
此时,如果不想传递该参数,需要明确指定,指定方式有两种:

  1. 通过required属性指定该参数不是必填的
/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
		,@RequestParam(value="username",required=false)String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

在这里插入图片描述
2. 通过defaultValue属性给该参数指定一个默认值

/**
 * 接收参数
 *    基本数据类型
 *    请求参数如果和形参名称不一致可以通过@RequestParam类指定
 * @param id
 * @param name
 * @return
 */
@RequestMapping("add") 
public String add(int id
		,@RequestParam(value="username",defaultValue="kaoya")String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

在这里插入图片描述

2.2对象

2.2.1简单对象

1.创建Book对象

public class Book {

	private int id;
	
	private String name;
	
	private String author;

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}
	
}

2.设置形参为Book对象接收数据

@Controller
public class BookController {

	/**
	 * 是@RequestMapping(value = "/doReg",method = RequestMethod.POST)的简写,
	 * 但是@PostMaping只能出现在方法上,不能出现在类上
	 * @param book
	 * @return
	 */
	//@RequestMapping("/add")
	@PostMapping("/add") 
	public String add(Book book){
		System.out.println(book);
		return "/index.jsp";
	}
}

3.表单传递数据

<form action="/add" method="post">
	<table>
		<tr>
			<td>编号</td>
			<td><input type="text" name="id"></td>
		</tr>
		<tr>
			<td>书名</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>作者</td>
			<td><input type="text" name="author"></td>
		</tr>
		<tr>
			<td><input type="submit" value="添加"></td>
		</tr>
	</table>
</form>

在这里插入图片描述
在这里插入图片描述

2.2.2包装对象

1.book对象包含Author对象
在这里插入图片描述
2.表单提交数据

<form action="add" method="post">
	<table>
		<tr>
			<td>编号</td>
			<td><input type="text" name="id"></td>
		</tr>
		<tr>
			<td>书名</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>作者年龄</td>
			<td><input type="text" name="author.age"></td>
		</tr>
		<tr>
			<td>作者姓名</td>
			<td><input type="text" name="author.name"></td>
		</tr>
		<tr>
			<td>作者性别</td>
			<td><input type="text" name="author.sex"></td>
		</tr>
		<tr>
			<td><input type="submit" value="添加"></td>
		</tr>
	</table>
</form>

在这里插入图片描述
3.结果
在这里插入图片描述

2.3数组集合类型

  1. 数组
    表单中直接传递多个参数:
<form action="user/doReg" method="post">
	<table>
		<tr>
			<td>用户名</td>
			<td><input type="text" name="username"></td>
		</tr>
		<tr>
			<td>用户密码</td>
			<td><input type="password" name="password"></td>
		</tr>
		<tr>
			<td>兴趣爱好</td>
			<td><input type="checkbox" name="favorites" value="zuqiu">足球
				<input type="checkbox" name="favorites" value="lanqiu">篮球 <input
				type="checkbox" name="favorites" value="pingpang">乒乓球</td>
		</tr>
		<tr>
			<td><input type="submit" value="注册"></td>
		</tr>
	</table>
</form>
	@RequestMapping("/doReg") 
	public String doReg(String username
			,String password,String[] favorites){
		System.out.println(username+"---"+password);
		for (String f : favorites) {
			System.out.println(f);
		}
		return "/index.jsp";
	}

在这里插入图片描述
在这里插入图片描述

这里的参数类型,只能使用数组,不能使用集合。如果非要用集合,可以自定义参数类型转换。

2.集合
除了自定义参数类型转换,如果想要使用集合去接收参数,也可以将集合放到一个包装类中。

public class User {
	
	private String username;
	private String password;
	private List<String> favorites;

	@Override
	public String toString() {
		return "User{" + "username='" + username + '\'' + ", password='" + password + '\'' + ", favorites=" + favorites
				+ '}';
	}

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public List<String> getFavorites() {
		return favorites;
	}

	public void setFavorites(List<String> favorites) {
		this.favorites = favorites;
	}
}

在这里插入图片描述
在这里插入图片描述这样,集合中也能收到传递来的参数。

总结:
1.数组(无论是基本数据类型还是对象数组)都可以直接写在接口参数中。
2.集合(无论是基本数据类型还是对象)都需要一个包装类将其包装起来,不能直接写在接口参数中。
3.对于基本数据类型,数组和集合在表单中的写法是一样的
4.对于对象数据类型,数组和集合在表单中的写法是一样的

2.4Date类型

接收数据类型是Date类型的需要通过转换器进行接收

	@RequestMapping("/update")
	public String update(Date d){
		System.out.println(d);
		return "/index.jsp";
	}

如果不转换直接访问提交会爆400错误
在这里插入图片描述
创建自定义的转换器

/**
 * 自定义转换器
 * 
 * @author dpb【波波烤鸭】
 *
 */
public class DateConvert implements Converter<String,Date>{

	@Override
	public Date convert(String msg) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			return sdf.parse(msg);
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}

}

配置转换器

<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"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
		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-4.3.xsd">
	
	<!-- 开启注解 -->
	<mvc:annotation-driven conversion-service="formattingConversionServiceFactoryBean"></mvc:annotation-driven>
	<!-- 开启扫描 -->
	<context:component-scan base-package="com.dpb.controller"></context:component-scan>
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<!-- 配置响应地址的前后缀 
		<property name="prefix" value="/user"/>
		<property name="suffix" value=".jsp"/>-->
	</bean>
	
	<!-- 配置转换器 -->
	<bean id="formattingConversionServiceFactoryBean" 
	class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="com.dpb.convert.DateConvert"/>
			</set>
		</property>
	</bean>
</beans>

在这里插入图片描述
在这里插入图片描述

3.响应数据

3.1ModelAndView
3.2HttpServletRequest
3.3HttpSession
3.4Map

	@RequestMapping("/query1")
	public String query1(Map<String,Object> map){
		map.put("msg", "map --> value");
		return "/index.jsp";
	}	

在这里插入图片描述
在这里插入图片描述
3.5Model

	@RequestMapping("/query2")
	public String query2(Model model){
		model.addAttribute("msg", "model --> value");
		return "/index.jsp";
	}

在这里插入图片描述
3.6ModelMap

	@RequestMapping("/query3")
	public String query3(ModelMap mm){
		mm.addAttribute("msg", "modelMap --> value");
		return "/index.jsp";
	}

在这里插入图片描述
注意:@SessionAttributes将数据保存在session作用域中,上面几个传值都是request作用域
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

4.post方式中文乱码问题处理

在web.xml文件中添加如下代码即可

<!-- spring框架提供的字符集过滤器 -->
    <!-- spring Web MVC框架提供了org.springframework.web.filter.CharacterEncodingFilter用于解决POST方式造成的中文乱码问题  -->
<filter>
   <filter-name>encodingFilter</filter-name>
   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
   <init-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
   </init-param>
</filter>
<filter-mapping>
   <filter-name>encodingFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>   
  • 8
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
SpringMVC是一个用于构建Web应用程序的Java框架。在SpringMVC处理请求响应是通过使用控制器方法来实现的。控制器方法使用@RequestMapping注解来映射请求的URL,并通过方法参数来获取请求参数和响应对象。 在处理请求时,可以使用@RequestParam注解来获取请求参数的值。例如,可以在方法参数上使用@RequestParam注解来获取请求的特定参数值。另外,也可以使用@PathVariable注解来获取URL的路径参数。 在处理响应时,可以使用@ResponseBody注解将方法的返回值直接写入HTTP响应,而不是进行视图跳转。这样可以直接返回字符串、JSON格式的数据或其他类型的数据。 另外,在SpringMVC,还有一些核心组件,如处理器映射器、处理器适配器和视图解析器。处理器映射器负责将请求映射到相应的控制器方法,处理器适配器负责将请求参数绑定到方法参数,并调用相应的控制器方法,视图解析器负责将方法的返回值解析为视图。 总结起来,SpringMVC通过控制器方法、注解和核心组件来处理请求响应,使得开发者可以方便地构建Web应用程序。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [springMVC请求响应](https://blog.csdn.net/weixin_38088097/article/details/105840310)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringMVC请求响应](https://blog.csdn.net/weixin_51146329/article/details/123166475)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

波波烤鸭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值