SpringMVC -> 处理及响应请求

一、基本操作

1.响应请求的方式

序号 响应方式 说明
1 不响应 void+@ResponseBody注解
2 ModelAndView 通过setViewName方法
3 直接指定响应页面 返回值为String类型,返回结果指定跳转地址
4 重定向 跳转地址前加redirect:前缀即可
5 HttpServletRequest和HttpServletResponse 形参中声明这两个变量。然后通过相关api跳转
ModelAndView
	@RequestMapping("/query")
	public ModelAndView query(){
		System.out.println("query");
		ModelAndView mv = new ModelAndView();
		mv.setViewName("/index.jsp");
		return mv;
	}
返回void

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

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

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

@RequestMapping("/test1")
@ResponseBody
public void test1() {    
   System.out.println("test1");
}
返回一个字符串

返回一个真正的字符串

/**
 * 返回一个字符串
 * @return
 */
@RequestMapping("/hello")
@ResponseBody
public String hello(){
	return "hello";
}
返回一个跳转页面名称

不需要加 @ResponseBody

@RequestMapping("/hi")
public String hello(){
	return "/index.jsp";
}
重定向跳转
	@RequestMapping("/delete")
	public String delete(){
		System.out.println("删除数据操作....");
		// 重定向
		return "redirect:/user/query";
	}
	
	@RequestMapping("/query")
	public String query(){
		System.out.println("query");		
		return "/hello";
	}

返回路径注意: 返回的字符带"/“表示从根目录下开始找,不带”/"从当前目录下查找

通过Request和Response对象处理
@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");
}

2. 参数绑定

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

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

/**
*浏览器传递过来的参数名称必须为id , name 
*/
@RequestMapping("add")
public String add(int id,String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

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

@RequestMapping("add") 
/**
* id username为浏览器传递过来的参数名称
*/
public String add(int id,@RequestParam("username")String name){
	System.out.println(id+"---"+name);
	return "/hello";
}

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

此时,如果不想传递该参数,需要明确指定,指定方式有两种:

  1. 通过required属性指定该参数不是必填的
@RequestMapping("add") 
public String add(int id
		,@RequestParam(value="username",required=false)String name){
	System.out.println(id+"---"+name);
	return "/hello";
}
  1. 通过defaultValue属性给该参数指定一个默认值
/**
*@PostMapping("/add")
*是 @RequestMapping(value = "/doReg",method = RequestMethod.POST)的简写
*但是@PostMaping只能出现在方法上,不能出现在类上
*/
@PostMapping("/add")
public String add(int id
		,@RequestParam(value="username",defaultValue="kaoya")String name){
	System.out.println(id+"---"+name);
	return "/hello";
}
2.2 数组集合类型
  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";
	}
  1. 集合
    除了自定义参数类型转换,如果想要使用集合去接收参数,也可以将集合放到一个包装类中。
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
				+ '}';
	}
	
	Getter and Setter methods...
	
	public List<String> getFavorites() {
		return favorites;
	}
	public void setFavorites(List<String> favorites) {
		this.favorites = favorites;
	}
}
@PostMapping("/add");
public String add(Book book){
	system.out.println(book);
	return "index.jsp";
}
//输出User{username='root', password='123', favorites=[zuqiu, lanqiu]}

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

扫描二维码关注公众号,回复: 9383204 查看本文章
2.3 Data类型

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

@ResponseBody
@RequestMapping("/update")
	public String update(Date d){
		System.out.println(d);
		return "字符串";
	}
	//不转换直接访问提交会报400-Bad Request 错误

创建自定义的转换器

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) {
			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" />
	<!-- 开启扫描 -->
	<context:component-scan base-package="com.zl" />
	<!-- 配置视图解析器 -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		 <property name="prefix" value="/WEB-INF/jsp/" /> 
		 <property name="suffix" value=".jsp"/> 
	</bean>

	<!-- 配置转换器 -->
	<bean id="formattingConversionServiceFactoryBean"
		class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
		<property name="converters">
			<set>
				<bean class="com.zl.springmvc.DateConvert" />
			</set>
		</property>
	</bean>
</beans>

浏览器输入http://localhost:8080/xxxx/update?d=2020-01-03就能看到控制台的日期格式输出了

3. 响应数据

3.1 ModelAndView
3.2 HttpServletRequest
3.3 HttpSession
3.4 Map

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

3.5 Model

	@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";
	}
index.jsp
<body>
	${msg}  <!-- 页面取值 -->
</body>

3.7 session

注意:@SessionAttributes将数据保存在session作用域中,上面几个传值都是request作用域

@Controller
@SessionAttributes({"msg"})
//将msg树型放在session作用域中,这样request和session中都有了
public class xxx{
</body>
	${requsetScope.msg}<br/>
	${sessionScope.msg}<br/>
</body>
发布了25 篇原创文章 · 获赞 0 · 访问量 343

猜你喜欢

转载自blog.csdn.net/weixin_45808666/article/details/103821886