Restful
REST(Representational State Transfer)表象化状态转变(表述性状态转变),在2000年被提出,基于HTTP、URI、XML、JSON等标准和协议,支持轻量级、跨平台、跨语言的架构设计。是Web服务的一种新的架构风格(一种思想)。
RESTFUL特点包括:
1、每一个URI代表1种资源;
2、客户端使用GET、POST、PUT、DELETE4个表示操作方式的动词对服务端资源进行操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源;
3、通过操作资源的表现形式来操作资源;
4、资源的表现形式是XML或者HTML;
5、客户端与服务端之间的交互在请求之间是无状态的,从客户端到服务端的每个请求都必须包含理解请求所必需的信息。 [1]
按照我们之前配置好的资源,我们正常情况下是这样写的
@RequestMapping("/h1")
public String t1( int a, int b, Model model){
int res=a+b;
model.addAttribute("msg","阿威"+res);
return "test";
}
这样的传参数h1?a=1&b=3用&拼接
方式二 使用restFul风格这样我们需要在参数前面添加@PathVariable注解
@RequestMapping("/h1/{a}/{b}")
public String t3( @PathVariable int a, @PathVariable int b, Model model){
int res=a+b;
model.addAttribute("msg","阿威t3:"+res);
return "test";
}
参数用/来进行分割
我们使用get方法来进行区分,这时注解参数有两个vaule、method
@RequestMapping(value = "/h1/{a}/{b}",method = RequestMethod.GET)
public String t2(@PathVariable int a,@PathVariable int b, Model model){
int res=a+b;
model.addAttribute("msg","阿威t2:"+res);
return "test";
}
用方法区分的另一种书写方式,直接写方法名
@GetMapping("/h1/{a}/{b}")
public String t5(@PathVariable int a,@PathVariable int b, Model model){
int res=a+b;
model.addAttribute("msg","阿威t5:"+res);
return "test";
}
@PostMapping("/h1/{a}/{b}")
public String t4(@PathVariable int a,@PathVariable int b, Model model){
int res=a+b;
model.addAttribute("msg","阿威t4:"+res);
return "test";
}
现在我们写一个from表单,使用post请求,这样他就会走上面的post方法,这里我们注意把表单路径写全。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/springmvc_02_war_exploded/h1/1/1" method="post">
<input type="submit">
</form>
</body>
</html>
我们可以观察到他们的显示页面都统一个test,这样是有利于我们后面的开发,我们使用这种方式来进行区分。
转发重定向
我们先使用转发和重定向地址都是自己写好的,所以就不用在使用视图配置InternalResourceViewResolver了
转发
我们可以在方法的参数中添加request、response方法。
@Controller
public class Forward {
@RequestMapping("/h2/t1")
public void test1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//转发
request.setAttribute("msg","你好");
request.getRequestDispatcher("/WEB-INF/jsp/test.jsp").forward(request,response);
}
}
直接在返回值操作
返回值直接写完整地址
@RequestMapping("/h2/t3")
public String test3(Model model) throws ServletException, IOException {
model.addAttribute("msg","你");
return "/WEB-INF/jsp/test.jsp";
}
直接返回值转发
@RequestMapping("/h2/t3")
public String test3(Model model) throws ServletException, IOException {
model.addAttribute("msg","你");
return "forward:/WEB-INF/jsp/test.jsp";
}
直接返回值重定向
@RequestMapping("/h2/t3")
public String test3(Model model) throws ServletException, IOException {
model.addAttribute("msg","你");
return "redirect:/index.jsp";
}
接受参数
我们在接受前端传来的参数是,最好在前面添加@RequestParam注解里面是重新命名的,
@RequestMapping("/user/t1")
public String test1(@RequestParam("username") String name, Model model){
System.out.println(name);
return "/WEB-INF/jsp/test.jsp";
}
在接受对象参数,在地址栏传递的参数名必须和对象中的属性名一致
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private String password;
}
@RequestMapping("/user/t2")
public String test2(User user, Model model){
System.out.println(user);
return "/WEB-INF/jsp/test.jsp";
}
表单提交乱码
我们正常情况下可以直接写一个filter过滤器就行,
public class Filter implements javax.servlet.Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
相应的映射地址
<filter>
<filter-name>filter</filter-name>
<filter-class>aw.filter.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>