SpringMVC课程链接
前端控制器:DispatcherServlet
(1)浏览器发送请求
(2)DispatcherServlet调Controller里面的一个某方法
(3,4)方法返回model数据,也需要返回视图view相关数据
(5)把model和view都提交给模板引擎,由模板引擎渲染生成动态HTML
SpringMVC底层原理详细版(待更)
@RequestMapping("/http")
//使用void无返回值的原因是因为response对象向浏览器返回任何数据,不依赖返回值
//请求对象和响应对象常用的接口HttpServletRequest request, HttpServletResponse response
public void http(HttpServletRequest request, HttpServletResponse response) {
//获取请求方式
System.out.println(request.getMethod());
//获取请求路径
System.out.println(request.getServletPath());
//获取请求行,封装请求行的很多数据,得到请求行的迭代器,key-value结构
Enumeration<String> enumeration = request.getHeaderNames();
while (enumeration.hasMoreElements()) {
//key
String name = enumeration.nextElement();
//value
String value = request.getHeader(name);
System.out.println(name + ": " + value);
}
//获取请求体,业务数据,包含参数
System.out.println(request.getParameter("code"));
//返回响应数据
//设置返回数据类型setContentType
//网页类型的文本text/html;字符集charset=utf-8——让网页支持中文
response.setContentType("text/html;charset=utf-8");
//获取输出流,使用完将输出流finally关闭
//Java7新的语法:try(...)自动生成finally,编辑自动加一个finally,前提是writer必须有close方法
try (PrintWriter writer = response.getWriter()) {
//打印网页
//完整的网页在下行代码前后还要输出
writer.write("牛客网
");
} catch (IOException e) {
e.printStackTrace();
}
}
以查询学生为例
//更简便处理请求的方式
//处理浏览器请求包括两个方面:1.处理请求数据,基于request2.向浏览器返回相应数据,基于response
//GET请求:处理请求数据
//查询所有学生,分页形式
// 分页条件:显示第几页,每页最多显示多少条数据
// /students?current=1&limit=20
//@RequestMapping声明请求路径,path指定访问路径,method声明请求方式
// RequestMethod.GET强制方法必须是GET请求
@RequestMapping(path = "/students", method = RequestMethod.GET)
@ResponseBody
//初次访问学生页面,没有current,limit参数,加注解@RequestParam
public String getStudents(
@RequestParam(name = "current", required = false, defaultValue = "1") int current,
@RequestParam(name = "limit", required = false, defaultValue = "10") int limit) {
System.out.println(current);
System.out.println(limit);
return "some students";
}
//还有一种方式:GET请求
//根据学生编号查询一个学生
// /student/123参数成为路径的一部分
@RequestMapping(path = "/student/{id}", method = RequestMethod.GET)
@ResponseBody
//获取参数变量@PathVariable("id")
public String getStudent(@PathVariable("id") int id) {
System.out.println(id);
return "a student";
}
//POST请求 浏览器向服务器提交数据
//浏览器打开带有表单的网页,在表单填写数据才能提交(静态)
// /templates文件夹中模板的网页是动态的,动态的表达式可以被model数据替换
// /static文件夹存放静态的
//GET请求传参缺点1.参数都显示在网页路径下2.带参数的路径长度有限,传递数据量有限
@RequestMapping(path = "/student", method = RequestMethod.POST)
@ResponseBody
//获取POST请求参数,参数与表单一致
public String saveStudent(String name, int age) {
System.out.println(name);
System.out.println(age);
return "success";
}
//向浏览器响应动态HTML数据
//声明访问路径
@RequestMapping(path = "/teacher", method = RequestMethod.GET)
//返回HTML不加注解@ResponseBody
//ModelAndView返回的是model和view
// SpringMVC原理:所有组件都由DispatcherServlet调度,调Controller的某一个方法,
// 方法返回model数据,也需要返回视图相关数据,把model和view都提交给模板引擎,由模板引擎渲染生成动态HTML
//ModelAndView的作用:封装要给DispatcherServlet返回的model和view两份数据
public ModelAndView getTeacher() {
//实例化对象
ModelAndView mav = new ModelAndView();
//模板需要的变量,需要多少个,add多少个
mav.addObject("name", "张三");
mav.addObject("age", 30);
//设置模板的路径和名字,templates文件夹下的demo文件夹下的view.html
mav.setViewName("/demo/view");
return mav;
}
//比上面略简单的响应网页,查询学校
@RequestMapping(path = "/school", method = RequestMethod.GET)
//返回类型String,指返回view的路径
//model是DispatcherServlet(持有对象的引用)自动实例化的bean
//与上面方法类似,上面是把model和view都封装到参数里,这个是将model转换到参数,将view路径返回DispatcherServlet
public String getSchool(Model model){
model.addAttribute("name", "北京大学");
model.addAttribute("age", 80);
return "/demo/view";
}
//向浏览器响应JSON数据(异步请求的时候才访问JSON数据)
//异步请求:注册B站判断昵称是否被占用,当前网页不刷新,访问服务器的数据库
//JSON字符串可以将Java对象转成JS对象,然后被浏览器解析 Java->JSON->JS
//查询员工
@RequestMapping(path = "/emp", method = RequestMethod.GET)
//返回JSON得加@ResponseBody
@ResponseBody
//用Map封装,自动转换为JSON格式key-value结构
public Map<String, Object> getEmp() {
Map<String, Object> emp = new HashMap<>();
emp.put("name", "张三");
emp.put("age", 23);
emp.put("salary", 8000.00);
return emp;
}
//返回一组员工,多个相似数据的情况
@RequestMapping(path = "/emps", method = RequestMethod.GET)
//返回JSON得加@ResponseBody
@ResponseBody
//用Map封装,自动转换为JSON格式key-value结构
public List<Map<String, Object>> getEmps() {
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> emp = new HashMap<>();
emp.put("name", "张三");
emp.put("age", 23);
emp.put("salary", 8000.00);
list.add(emp);
emp = new HashMap<>();
emp.put("name", "李四");
emp.put("age", 24);
emp.put("salary", 9000.00);
list.add(emp);
emp = new HashMap<>();
emp.put("name", "王五");
emp.put("age", 25);
emp.put("salary", 10000.00);
list.add(emp);
return list;
}