springmvc
后端控制器的实现方式
-
可以实现Controller接口实现后端控制器类---适配器是SimpleController...,重写handleRequest方法,返回值是ModelAndView.需要利用此类的addObject来添加模型数据---此数据最后转到域对象中,默认是转发或者包含(因为WEB-INF是受保护的文件夹,只有转发或者包含才可以访问),所以数据存入request域对象
在这里映射器,适配器和视图解析器我们也可以省略不写,只需要写后端控制器即可,mvc自带配置文件中有默认值,如果我们没有写系统会执行默认设定.注解模式连后端控制器也可以不写,配置文件中写扫描注解的标签即可.
- 可以实现HttpRequestHandler接口实现后端控制器---适配器是HttpRequestHandler...与实现controller接口一样也是重写了handleRequest方法,但是返回值是void.
这种方法相当于原生态的Servlet,使用原生态的响应方式的时候,不再经过视图解析
- 任意类的方式---主要是借助注解
后端控制器类需要2个注解,一个是控制层注解,因为控制层我们也没有配置,当然我们也可以选择在spring.xml中选择配置后端控制器, 还有一个是映射器注解,用来匹配指定请求和指定方法.
后端控制器中方法的返回值类型
-
ModelAndView同上
-
void同上
-
String返回的是逻辑视图的url地址,前端控制器根据返回的url找到指定页面
-
在视图解析器中可以设置前缀和后缀,提取共同的部分,此方式不适合返回值为void的原生态的servlet,因为他通过转发返回地址值,不会经过视图解析器
-
任意类型---一般是实体类、包装类、集合
- 需要json包,Jackson---进行json和对象的转换
- springmvc默认使用Jackson包(jsonlib)
- 添加jquery.js文件
- 准备页面,ResponseBody注解的作用是调用Jackson功能,他也是通过mvc配置文件中的annotation-driven才生效的
package com.offcn.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.offcn.bean.Person; @Controller public class AjaxController { @RequestMapping("/ajax.action") //这个注解的作用是调用Jackson功能将此处返回的对那个转换为json串,这个注解的加载和RequestMapping //一样都是通过配置文件中的mvc:annotation-driven生效的 @ResponseBody public Person ajax() { Person person = new Person(); person.setPid(10010); person.setMoney(1000.0); person.setPname("沙和尚"); return person; } }
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>异步请求</title>
<script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
</head>
<body>
login.....
<hr>
<p>实现异步请求</p>
<button id="btn">异步请求</button>
<script type="text/javascript">
$(function() {
$("#btn").click(function() {
$.ajax({
url : "ajax.action",
dataType : "json",//json会将返回的字符串转换为对象
type : "post",
cache : false,
//发送给服务器数据的格式,默认值是这个,和form表单中的encType一样
contentType : "application/x-www-form-urlencoded",
success : function(data) {
console.log(data);//打印到浏览器控制台
},
error : function() {
alert("error");
}
});
});
});
</script>
</body>
</html>
如何实现重定向操作
重定向也可以理解为二次转发,服务器接收到客户端请求时只返回一个新的路径给客户端, 客户端根据这个新的路径发送二次请求给服务器, 服务器根据这个新的地址找到指定页面返回给客户端, 所以客户端的地址栏中的url才发生了变化.
重定向用到的是redirect关键字,格式是 redirect:新的url
传参
- springmvc的配置文件,默认位置是在WEB-INF下,默认名称的格式:servlet-name标签中的名称加上中划线加上servlet组成的名称,例如:DispatcherServlet-servlet.xml
- spring的配置文件默认是applicationContext.xml
-
简单的类型---int、String等参数的传递,页面中参数的名称和处理请求的方法的形参名称一致,框架会自动帮我们匹配,其实底层还是通过request.getparameter()来实现的.
- get请求如果出现中文乱码,如何处理?tomcat8以前会有get请求中文乱码,但是tomcat8之后就不存在这个问题了
String name = request.getParameter(“name”); name = new String(name.getBytes("iso8859-1"),"utf-8"); System.out.println(name);
- post请求是存在乱码的,如何解决? --- 添加过滤器
直接用会存在乱码,添加过滤器解决
filter-class的从下面这个class中找
- 在页面设置了一个新的字段--传递日期,到方法中添加形参接收数据
在springmvc中日期类型,从页面向后台送的时候,springmvc无法解析,所以出现400问题;
解决:可以自定义一个解析器--类型转换器;也可以添加注解
-
自定义类型转换器---------首先先定义转换器类,然后在前端控制器配置文件中创建转换器工厂,然后在<mvc:annotation-drive>添加属性conversion-service="??"值就是转换器工厂的id值
package com.offcn.converter; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.core.convert.converter.Converter; public class DateConverter implements Converter<String, Date> { @Override public Date convert(String str) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = sdf.parse(str); } catch (ParseException e) { e.printStackTrace(); } return date; } }
转换器工厂的class地址为:
- 注解实现类型转换. 上面的方式太麻烦了,我们一般用注解实现,或者更简单的,我们用String来接受日期即可.配置文件无需更改
-
- 页面的传递数据key=value,key保持和方法中形参同名;如果不同名,要添加注解@RequestParam,有value属性、defaultValue属性、required属性. value属性用来设置页面中参数的key名;defaultValue属性用来设置默认值(在分页的时候比较常用),意思是当页面没有送来此属性值的时候,那么这个属性所对应的形参的值就是默认值, required属性用来设置是否必须传递值
- 传递的参数封装到对象中
- 准备实体类,我们把注解加载实体类上
- 准备页面
- 执行单元
-
页面传参传递集合
- 数组. 在实现CRUD操作的时候 select * from student where id in(1,3,5,10);
- list集合
要实现批量修改,把多个对象的数据传到后台. 批量修改的格式
批量修改---需要一次向后台送多个对象过去
页面需要修改---将值直接显示到文本框
定义一个包装的类型,用来把页面传来的数据封装成对象
保证每一组都是同一个对象的数据,用数组下表来确定同一个对象
执行单元
- 数组. 在实现CRUD操作的时候 select * from student where id in(1,3,5,10);
-
总结:实现的是从页面到后台的传递参数:简单类型要求同名如果不同名需要加注解;对象封装数据;List集合封装数据不需要同名.
- get请求如果出现中文乱码,如何处理?tomcat8以前会有get请求中文乱码,但是tomcat8之后就不存在这个问题了
从后台到页面传参数
- ModelAndView可以实现addObject(key,value);---转存到request域对象;此对象传参方式适合于方法返回值就是它自己
- request.setAttribute(key,value)可以实现向页面传递参数;此方式适合于方法返回值为void
- Model接口和ModelMap实现类---也可以传参到页面,此方式适合于方法的返回值为String.
- 使用model接口:我们只需要在形参上写出model即可,后面直接用,实现类对象框架会帮我们创建
package com.offcn.controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import com.offcn.bean.Person; @Controller public class ModelController { @RequestMapping("/model.action") //我们只要写出model接口就可以了,实现类对象框架会帮我们创建 public String model(Model model) { Person person = new Person(); person.setPid(1111); person.setPname("atutu"); model.addAttribute(person); return "model/model2"; } }
-
使用ModelMap实现类,可以直接使用,和model基本相同
- 使用model接口:我们只需要在形参上写出model即可,后面直接用,实现类对象框架会帮我们创建
- 异步传参---异步请求通过@ResponseBody将对象转为json串,再由异步引擎将数据接收回到页面
注解@CookieValue
作用是从cookie中获取值;先有cookie,然后才能获取出来值
实现:
- 先创建cookie---服务器端, 页面<a href="cookie.action">提交发出</a>
- 响应时送回去
- 再次请求时,又送回来
package com.offcn.controller;
import java.io.IOException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class CookieController {
@RequestMapping("/cookie.action")
public void createCookie(HttpServletRequest request,HttpServletResponse response) throws IOException {
//创建cookie
Cookie co = new Cookie("name","阿兔兔");
//响应时将cookie送回
response.addCookie(co);
response.sendRedirect("cookie.jsp");
}
//二次响应
@RequestMapping("/second.action")
public String getCookie(@CookieValue(value = "name")String cookie) throws IOException {
System.out.println(cookie);
return null;
}
}