MVC框架基本使用及中文乱码问题学习笔记

在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>

2.url提交:

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值