新建一个子项目,SpringMVC-04-Controller,搭建好项目
DispatcherServlet
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring-mvc.xml
1
DispatcherServlet
/
test
${msg}
在org.springframework.web.servlet.mvc包下,有一个名为Controller
的接口,接口中只有一个方法;
// 实现该接口的类获得Controller功能
public interface Controller {
// 处理请求且返回一个 ModelAndView 对象
ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
新建 ControllerTest 类,实现 Controller 接口
package com.moondream.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ControllerTest implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("msg", "ControllerTest");
mv.setViewName("/test");
return mv;
}
}
将 ControllerTest 注册到 SpringIOC 中,id对应请求路径,class对应处理请求的类
启动Tomcat,测试访问路径:http://localhost:8080/spring04/t1
测试成功!
注意:
@Controller
@RequestMapping
新建 ControllerTest2 类 和 ControllerTest3 类,标上注解
package com.moondream.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class ControllerTest2 {
@RequestMapping("/t2")
public String test(Model model) {
model.addAttribute("msg", "ControllerTest2");
return "test";
}
}
package com.moondream.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/t3")
public class ControllerTest3 {
@RequestMapping("/test")
public String test(Model model) {
model.addAttribute("msg", "ControllerTest3");
return "test";
}
}
将 ControllerTest2、ControllerTest3 注册到 SpringIOC中,这里可以使用两种方式
或者
启动Tomcat,测试访问路径:
http://localhost:8080/spring04/t2
http://localhost:8080/spring04/t3/test
测试成功!
注解方式是平时使用的最多的方式!
缩写:REST (不是"rest"这个单词)
外文名:Representational State Transfer,简称REST。
中文名:表现层状态转移。
提出时间:2000年。
属性:一种软件架构风格。(以Web为平台的,web服务的架构风格,前后端接口时候用到。)
REST之所以晦涩难懂,是因为前面主语(Resource )被去掉了。
全称是: Resource Representational State Transfer。
通俗来讲就是:资源在网络中以某种表现形式进行状态转移。
分解开来讲解:
Resource:资源,即数据(这是网络的核心);
Representational:某种表现形式,比如用JSON,XML,JPEG等;
State Transfer:状态变化。通过HTTP的动词(get查询、post新增、put修改、delete删除)实现。
一句话描述REST实质:
只使用名词URL来定位资源,用HTTP协议里的动词(GET、POST、PUT、DELETE)来实现资源的增删改查操作。
传统方式操作资源 :通过不同的URL路径和参数来实现不同的效果!方法单一,post 和 get
REST风格操作资源 :参数设计进URL路径,增强语义,实现统一接口,URL表示资源位置,请求方式表示行为,实现不同的效果!如下:请求地址一样,但是功能可以不同!
总结:
看Url就知道要什么
看http method就知道干什么
看http status code就知道结果如何
从上面的定义中,我们可以发现REST其实是一种组织Web服务的架构风格,
并不是实现Web服务的一种技术(注意:不是一种技术!!!也不是一种标准!!!),
其目标是为了创建具有良好扩展性的网络化分布式系统。
反过来,作为一种风格,其具备了一系列架构级特点。这些特点有:
如果一个系统满足了上面所列出的五条特点,那么该系统就被称为是RESTfUL的。
前后端分离
前端拿到数据只负责展示和渲染,不对数据做任何处理。
后端处理数据并以JSON格式传输出去,定义这样一套统一的接口,在web,ios,android三端都可以用相同的接口,达成复用(因为不需要写三次代码,一次代码可以公用给三端;另外,修改代码只要修改一次,三端都同步访问新代码,不需要修改三次代码。)
无状态约束,正是它的一个缺点。
其需要在每次请求中包含所有必要信息,来维持客户端状态,扩大了数据传输量,增大了网络传输压力。
在项目下新建一个Java类 RestFulController
package com.moondream.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("/t4")
public class RestFulController {
@RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.GET)
public String add(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {
int res = p1 + p2;
model.addAttribute("msg", "相加结果为:" + res);
return "test";
}
@RequestMapping(value = "/{p1}/{p2}",method = RequestMethod.POST)
public String subtract(@PathVariable Integer p1, @PathVariable Integer p2, Model model) {
int res = p1 - p2;
model.addAttribute("msg", "相减结果为:" + res);
return "test";
}
}
代码解释:
修改 test.jsp
test
${msg}
代码解释:
新增一个表单,以post方式发起请求,与get请求做区别,指向同一个URL。
启动Tomcat,访问测试路径:http://localhost:8080/spring04/t4/1/2
如图,http://localhost:8080/spring04/t4/1/2 URL为特定资源位置,Get和Post两种请求方法为 访问行为,分别代表 相加 和 相减。
使用Get请求访问资源,得到相加结果为3,使用Post请求访问资源,得到相减结果为-1。
这种将 ”行为“ 从URL中抽离出来,用Http动词代替,URL只表示纯粹的资源位置的web设计,符合Rest风格,是RestFul的。
对于@RequestMapping,有一些组合注解:
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
这些注解相当于指定了method
属性的@RequestMapping,是特定method
@RequestMapping的快捷方式,详细的可以去看看源码,很简单,这里不细说了。
每个程序员都要知道的:小黄鸭调试法
场景一:我们都有过向别人(甚至可能向完全不会编程的人)提问及解释编程问题的经历,但是很多时候就在我们解释的过程中自己却想到了问题的解决方案,然后对方却一脸茫然。
场景二:你的同行跑来问你一个问题,但是当他自己把问题说完,或说到一半的时候就想出答案走了,留下一脸茫然的你。
其实上面两种场景现象就是所谓的 小黄鸭调试法(Rubber Duck Debuging),又称橡皮鸭调试法,它是我们软件工程中最常使用调试方法之一。
此概念据说来自《程序员修炼之道》书中的一个故事,传说程序大师随身携带一只小黄鸭,在调试代码的时候会在桌上放上这只小黄鸭,然后详细地向鸭子解释每行代码,然后很快就将问题定位修复了。
这其实就是典型的 费曼学习法,借助向别人输出知识,来印证自身所学和总结经验。
写博客其实也是一样的哦!
参考文章 :
https://blog.csdn.net/SeniorShen/article/details/111591122
https://www.zhihu.com/question/28557115
参与评论
手机查看
返回顶部