在SpringMVC中,我们把接受用户请求、处理用户请求的类称之为Controller(控制器)
3.1创建控制器
3.1.1
1.创建名为com.qfedu.controllers的包(这个包需要在spring注解扫描的范围内)
2.创建一个类(无需做任何的继承和实现)
3.在类上添加@Controller 声明此类为spring的控制器
4.在类上添加@RequestMapping(“url”) 声明此控制器类的请求url
@Controller
@RequestMapping("/book")
public class BookContoller {
}
3.1.2
在控制器类中定义处理请求的方法
在一个控制器类中可以定义多个方法处理不同的请求
在每个方法上添加@RequestMapping(“url”)用于声明当前方法请求的url
@Controller
@RequestMapping("/book")
public class BookContoller {
@RequestMapping("/add")
public void add()
{
System.out.println("bookadd");
}
@RequestMapping("/list")
public void list()
{
System.out.println("booklist");
}
3.1.3访问
在浏览器中输入:http://localhost:8080/springmvc_demo02/book/add
可以在idea控制台得到:
3.2静态资源配置
静态资源:html、css、js、 图片 字体 等
3.2.1
web.xml中/*和/的区别:
/*是拦截所有的http请求 包括.jsp的请求 都作为控制器类的请求路径来处理
/ 是拦截所有的http请求 不包括.jsp的请求 但不会放行静态资源请求 htms/css/js图片
3.2.2静态资源放行配置
在springmvc的配置文件配置:
<!-- 放行该目录下的资源-->
<mvc:resources mapping="/css/**" location="/css/"/>
3.3前端提交数据到控制器
3.3.1创建前端页面
book-add.jsp表单中的action属性设置控制器类的url和对应方法的url组合路径
book-add.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>添加图书</h3>
<form action="book/add" method="post">
<p>图书名称:<input type="text"></p>
<p>图书作者:<input type="text"></p>
<p>图书价格:<input type="text"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
</html>
3.3.2前端页面提交数据
1.表单提交:输入框需要提交name属性,springmvc控制器是通过name属性取值的
<body>
<h3>添加图书</h3>
<form action="book/add" method="post">
<p>图书名称:<input type="text"></p>
<p>图书作者:<input type="text"></p>
<p>图书价格:<input type="text"></p>
<p><input type="submit" value="提交"></p>
</form>
</body>
3.AJAX提交:请求行、请求头、请求体都可以用来传值
3.4控制器接受前端数据提交的数据
3.4.1请求行传值
表单提交
url提交
ajax请求的url传值
. p o s t ( ) / .post()/ .post()/.get()的传值
@RequestParam注解用于接受请求行传递的数据
前端提交数据
<form action="book/add" method="post">
<p>图书名称:<input type="text" name="name"></p>
<p>图书作者:<input type="text" name="author"></p>
<p>图书价格:<input type="text" name="price"></p>
<p><input type="submit" value="提交"></p>
</form>
控制器接受数据
@RequestMapping("/add")
public void add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
}
若控制器方法中接受数据的参数名与请求行传值的key一致,则可以省略RequestParam注解
3.4.2请求头传值
ajax封装的请求头数据
$.ajax({
…
headers:{
}
})
实例:
前端:
<script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function () {
$.ajax({
url:"book/list",
type:"post",
headers:{
token:"wahhhhhhh"
},
success:function (res) {
console.log(res);
}
});
});
</script>
控制器:
@RequestMapping("/list")
public void list(@RequestHeader("token") String token)
{
System.out.println("booklist");
System.out.println(token);
}
@RequestHeader 用于接受请求头传递的数据
3.4.3请求体传值
ajax封装的请求体数据
$.ajax({
…
data:{
}
})
实例:
前端:
<script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function () {
var obj={};
obj.bookName="python";
obj.bookAuthor="张二狗";
obj.bookPrice="2.22";
$.ajax({
url:"book/update",
type:"post",
contentType:"application/json",
data:obj,
success:function (res) {
console.log(res);
}
});
});
</script>
控制器:
@RequestMapping("/update")
public void update(HttpServletRequest request) throws IOException {
System.out.println("bookupdate");
ServletInputStream is=request.getInputStream();
StringBuffer buffer=new StringBuffer();
byte[] bs=new byte[1024];
int len=-1;
while((len=is.read(bs))!=-1)
{
String s=new String(bs,0,len);
buffer.append(s);
}
System.out.println(buffer.toString());
}
前端发送的是一个json对象 需要用HttpServletRequest接收(古老方法)
@RequestBody 注解用于接受请求头传递的数据 将前端请求体提交的json格式转换成java对象
依赖于jackson包(maven导入)
前端:
<script type="text/javascript" src="http://libs.baidu.com/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$("#btn1").click(function () {
var obj={};
obj.bookName="python";
obj.bookAuthor="张二狗";
obj.bookPrice="2.22";
$.ajax({
url:"book/update",
type:"post",
contentType:"application/json",
data:JSON.stringify(obj), //data的值为jason格式的字符串 contentType必须设置为json
success:function (res) {
console.log(res);
}
});
});
</script>
bean实体类:
public class book {
private int bookId;
private String bookName;
private String bookAuthor;
private double bookPrice;
set get tostring
}
控制器:
@RequestMapping(“/update”)
public void update(@RequestBody book book) throws IOException {
System.out.println("bookupdate");
// //servlet的处理方式,使用request的输入流接受请求体数据
// ServletInputStream is=request.getInputStream();
// StringBuffer buffer=new StringBuffer();
// byte[] bs=new byte[1024];
// int len=-1;
// while((len=is.read(bs))!=-1)
// {
// String s=new String(bs,0,len);
// buffer.append(s);
// }
// System.out.println(buffer.toString());
System.out.println(book.toString());
}
3.5 控制器响应前端请求
3.5.1 控制器响应同步请求
同步请求:form 超链接
处理同步请求的方法的返回类型定义为String或者ModelAndView,以实现页面跳转
返回类为String
转发
@RequestMapping("/add")
public String add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
return "/tips.jsp";
}
重定向
@RequestMapping("/add")
public String add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
return "redirect:/tips.jsp";
返回类型为ModelAndView
转发
@RequestMapping("/add")
public ModelAndView add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
ModelAndView modelAndView = new ModelAndView("/tips.jsp");
return modelAndView;
}
重定向
@RequestMapping("/add")
public ModelAndView add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
ModelAndView modelAndView = new ModelAndView("redirect:/tips.jsp");
return modelAndView;
3.5.2控制器相应异步请求
异步请求:ajax请求参数
1。使用response中的输出流进行相应
控制器方法的返回类型为void
控制器方法添加HttpServletResponse response参数
在方法中通过responce获取输出流,使用流响应ajax请求
@RequestMapping("/update")
public void update(@RequestBody book book,HttpServletResponse response) throws IOException {
System.out.println("bookupdate");
System.out.println(book);
String s=new ObjectMapper().writeValueAsString(book);
response.setCharacterEncoding("utf-8");
response.setContentType("application/json");
PrintWriter out=response.getWriter();
out.println(s);
out.flush();
out.close();
}
2.直接在控制器方法返回响应的对象(MVC特别提供)
控制器方法的返回类型设置为响应给ajax请求的对象类型
在控制器方法前添加@ResponseBody注解 将返回的对象转换成json响应给ajax请求
**@RequestMapping("/update")
@ResponseBody
public List<book> update(@RequestBody book book) throws IOException {
System.out.println("bookupdate");
List<book> books=new ArrayList<book>();
books.add(new book(1,"java","里斯",2.22));
books.add(new book(3,"1","2",4.44));
return books;
}**
3.5.3 控制器响应同步请求的数据传递
对于同步请求的转发响应,我们可以传递参数到转发的页面,
返回类型是String
在控制器方法中定义一个Model类型的参数
在return页面之前,向model添加键值对,添加的键值对就会被传递到下一个页面
@RequestMapping("/add2")
public String add2(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price
, Model model)
{
System.out.println("bookadd2");
System.out.println(name);
System.out.println(author);
System.out.println(price);
model.addAttribute("key1","value1");
model.addAttribute("book",new book(1,"1","1",1));
return "/tips.jsp";
}
除了使用Model对象传值外,还可以直接使用HttpServletRequest对象
返回类型是ModeAndView
public ModelAndView add(@RequestParam("name") String name,
@RequestParam("author") String author,
@RequestParam("price") double price)
{
System.out.println("bookadd");
System.out.println(name);
System.out.println(author);
System.out.println(price);
ModelAndView modelAndView = new ModelAndView("/tips.jsp");
modelAndView.addObject("key1","value1");
modelAndView.addObject("book",new book(1,name,author,price));
return modelAndView;
}
3.6解决中文乱码问题
乱码途径:前端编码 后端编码 传输过程
3.6.1前端编码:
1.JSP页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
2.HTML页面
<meta charset="UTF-8">
3.6.2服务器编码
tomcat/conf/server.xml -》 connector -》 URIEncoding=“UTF-8”
3.6.3设置SpringMVC的编码方式
在web.xml中配置SpringMVC编码过滤器的编码方式
<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>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
若控制台出现乱码
则需要在tomcat设置的VM options项添加:-Dfile.encoding=utf-8