小学生都能学会的springmvc入门基础
Posted 结构化思维wz
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小学生都能学会的springmvc入门基础相关的知识,希望对你有一定的参考价值。
小学生都能学会的springmvc!
一、什么是springmvc??
MVC模型大家都知道吧? 模型(Model),视图(View),控制器(Controller)的简写,是一种软件设计规范。
- **Model(模型):**数据模型,提供要展示的数据,因此包含数据和行为,可以认为是领域模型或JavaBean组件(包含数据和行为),不过现在一般都分离开来:Value Object(数据Dao) 和 服务层(行为Service)。也就是模型提供了模型数据查询和模型数据的状态更新等功能,包括数据和业务。
- **View(视图):**负责进行模型的展示,一般就是我们见到的用户界面,客户想看到的东西。
- **Controller(控制器):**接收用户请求,委托给模型进行处理(状态改变),处理完毕后把返回的模型数据返回给视图,由视图负责展示。也就是说控制器做了个调度员的工作。
1.springmvc概述
Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架。
Spring MVC的特点:
- 轻量级,简单易学
- 高效 , 基于请求响应的MVC框架
- 与Spring兼容性好,无缝结合
- 约定优于配置
- 功能强大:RESTful、数据验证、格式化、本地化、主题等
- 简洁灵活
2.springmvc的执行原理
二、springmvc的第一个程序
了解了springmvc的执行原理后,我们来看看如何用springmvc快速开发我们的程序,以及相关的配置。
1.配置版(古老方案,了解原理)
-
创建web项目,导入springmvc相关依赖
-
看执行原理首先我们需要一个中央控制器,这是一个servelet,所以我们需要在web.xml文件中注册DispatcherServlet;
<servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--关联一个springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--启动级别-1--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的请求;(不包括.jsp)--> <!--/* 匹配所有的请求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
-
然后我们发现有处理器映射器和处理器适配器,这两个在springmvc配置文件中配置。
添加 处理映射器 <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> 添加 处理器映射器和适配器 <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
-
下一步就是 视图解析器,例如我们jsp,thymeleaf等视图层需要被此解析。
<!--视图解析器:DispatcherServlet给他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前缀--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后缀--> <property name="suffix" value=".jsp"/> </bean>
-
编写Controller(接口版)
public class HelloController implements Controller { @RequestMapping("hello") //通过/hello的请求会被此controller处理,这个需要配置注解驱动 @Override public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception { //创建对象 ModelAndView mv =new ModelAndView(); //addObject方法,把对象封装进去 mv.addObject("msg","hello"); //setViewName,指定要跳转的视图名称 mv.setViewName("index"); return mv; } }
-
编写视图层(此处用jsp做例子)
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Kuangshen</title> </head> <body> ${msg} </body> </html>
-
测试,localhost:8080/hello ,页面显示hello
2.注解版(常用)
基本跟上面配置相同
-
web.xml 中基本需要配置的有:
1.注册中央处理器 2.关联springmvc配置文件 3.启动界别 4.映射路径 5.过滤器(避免乱码) <filter> <filter-name>encoding</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> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
-
springmvc.xml 中基本需要配置的有:
1.包扫描(扫描注解用) 2.<mvc:annotation-driven /> 处理器映射器适配器最优解(注解驱动) 3.视图解析器 4.过滤静态资源 5.拦截器 6....
-
Controller的不同点(采用@controller注解)
@Controller 相当于在配置文件中注册了bean public class HelloController { @RequestMapping("hello") //方法中声明Model类型的参数是为了把Action中的数据带到视图中; public String hello(Model model){ //向模型中添加属性msg 与 值,可以在jsp中取出并渲染 model.addAttribute("msg","hello"); return "index"; //return一个视图名,交给视图解析器 } }
3.总结
这仅仅是springmvc基本的一个程序需要,下面会有更多相关内容,不过springmvc的流程大致应该可以理解了吧。数据处理交互,后来会有详细介绍。
@Controller注解类型用于声明Spring类的实例是一个控制器
@RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
三、RestFul 风格
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST(增)、DELETE(删)、PUT(改)、GET(查),使用不同方法对资源进行操作。
1.传统方式操作资源:
通过不同参数实现不同效果,方法单一
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
2.RestFul风格操作资源:
可以根据不同方法来实现不同效果,例如一样的请求地址可以实现功能不一样
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
3.@PathVariable
这个注解的作用是,让方法的值对应绑定到一个url变量上。
例如我们在url上传两个数字,并相加;
@Controller
public class RestFulController {
//映射访问路径
@RequestMapping("/rest/{p1}/{p2}")
public String index(@PathVariable int p1, @PathVariable int p2, Model model){
int result = p1+p2;
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "结果:"+result);
//返回视图位置
return "test";
}
}
我们访问的url : locahost:8080/rest/1/2
界面显示: 结果:3
那么我们使用@PathVariable的好处是什么??
- 使路径变得更加简洁;
- 获得参数更加方便,框架会自动进行类型转换。
- 通过路径变量的类型可以约束访问参数,如果类型不一样,则访问不到对应的请求方法,如这里访问是的路径是/rest/1/a,则路径与方法不匹配,而不会是参数转换失败。
4.method属性
用于约束请求的类型,可以收窄请求范围。指定请求谓词的类型如GET, POST, HEAD, OPTIONS, PUT, PATCH, DELETE, TRACE等
例如下面个注解的功能相同
@RequestMapping(value = "/hello",method = {RequestMethod.GET})
@GetMapping("hello")
通过不同的方法,是resful风格能实现相同请求地址,实现功能不一样的原因。
四、数据处理及跳转
springmvc参数接受处理?结果跳转处理?
1.结果跳转的方式
1.1 ModelAndView
设置ModelAndView对象,根据view的名称,和视图解析器跳转到指定页面
1.2 springmvc 实现
没有视图解析器:
@Controller
public class ResultSpringMVC {
@RequestMapping("/rsm/t1")
public String test1(){
//转发
return "/index.jsp";
}
@RequestMapping("/rsm/t2")
public String test2(){
//转发二
return "forward:/index.jsp";
}
@RequestMapping("/rsm/t3")
public String test3(){
//重定向
return "redirect:/index.jsp";
}
有视图解析器:
重定向 , 不需要视图解析器 , 本质就是重新请求一个新地方, 所以注意路径问题.
@Controller
public class ResultSpringMVC2 {
@RequestMapping("/rsm2/t1")
public String test1(){
//转发
return "test";
}
@RequestMapping("/rsm2/t2")
public String test2(){
//重定向
return "redirect:/index.jsp";
//return "redirect:hello.do"; //hello.do为另一个请求/
}
2.数据处理
2.1 提交的域名称和处理方法的参数名一致
http://localhost:8080/hello?name=zhangsan
@RequestMapping("/hello")
public String hello(String name){
System.out.println(name);
return "hello";
}
输出结果:zhangsan
2.2 提交域名称与处理方法参数名不一致(@RequestParam)
http://localhost:8080/hello?username=lisi
//@RequestParam("username") : username提交的域的名称 .
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name){
System.out.println(name);
return "hello";
}
输出结果:lisi
2.3 提交的是一个对象
http://localhost:8080/mvc04/user?name=liuyifei&id=1&age=25
//User实体类
public class User {
private int id;
private String name;
private int age;
//构造
//get/set
//tostring()
}
//处理方法
@RequestMapping("/user")
public String user(User user){
System.out.println(user);
return "hello";
}
后台输出:User { id=1, name=‘liuyifei’, age=25 }
注意:如果使用对象的话,前端传递的参数名和对象名必须一致,否则就是null。
3.数据显示到前端
3.1 通过ModelAndView
public class ControllerTest1 implements Controller {
public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
//返回一个模型视图对象
ModelAndView mv = new ModelAndView();
mv.addObject("msg","ControllerTest1");
mv.setViewName("test");
return mv;
}
}
3.2 通过ModelMap
@RequestMapping("/hello")
public String hello(@RequestParam("username") String name, ModelMap model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("name",name);
System.out.println(name);
return "hello";
}
3.3 通过Model
@RequestMapping("/ct2/hello")
public String hello(@RequestParam("username") String name, Model model){
//封装要显示到视图中的数据
//相当于req.setAttribute("name",name);
model.addAttribute("msg",name);
System.out.println(name);
return "test";
}
3.4 对比
就对于新手而言简单来说使用区别就是:
Model 只有寥寥几个方法只适合用于储存数据,简化了新手对于Model对象的操作和理解;
ModelMap 继承了 LinkedMap ,除了实现了自身的一些方法,同样的继承 LinkedMap 的方法和特性;
ModelAndView 可以在储存数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。
五、JSON交互
什么是JSON?
- JSON(javascript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛。
- 采用完全独立于编程语言的文本格式来存储和表示数据。
- 简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。
- 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
在 JavaScript 语言中,一切都是对象。因此,任何JavaScript 支持的类型都可以通过 JSON 来表示,例如字符串、数字、对象、数组等。看看他的要求和语法格式:
- 对象表示为键值对,数据由逗号分隔
- 花括号保存对象
- 方括号保存数组
例如:
{"name": "小梦"}
{"age": "18"}
{"sex": "男"}
JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串。
var obj = {a: 'Hello', b: 'World'}; //这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a": "Hello", "b": "World"}'; //这是一个 JSON 字符串,本质是一个字符串
1.JSON与JS 对象互转
要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
var obj = JSON.parse('{"a": "Hello", "b": "World"}');
//结果是 {a: 'Hello', b: 'World'}
要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
var json = JSON.stringify({a: 'Hello', b: 'World'});
//结果是 '{"a": "Hello", "b": "World"}'
测试:
<script type="text/javascript">
//编写一个js的对象
var user = {
name:"王泽",
age:20,
sex:"男"
};
//将js对象转换成json字符串
var str = JSON.stringify(user);
console.log(str);
//将json字符串转换为js对象
var user2 = JSON.parse(str);
console.log(user2.age,user2.name,user2.sex);
</script>
控制台结果:
{"name":"王泽","age":20,"sex":"男"}
20 "王泽" "男"
2.Controller与Json(本案例仅介绍jackson)
-
添加依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
-
编写实体类
@Data//需要lombok @AllArgsConstructor @NoArgsConstructor public class User { private String name; private int age; private String sex; }
-
编写controller
@Controller public class UserController { @RequestMapping("/json1",produces = "application/json;charset=utf-8") @ResponseBody //有这个注解就不走视图解析器了 public String json1() throws JsonProcessingException { //创建一个jackson的对象映射器,用来解析数据 ObjectMapper mapper = new ObjectMapper(); //创建一个对象 User user = new User("王泽", 3, "男"); //将我们的对象解析成为json格式 String str = mapper.writeValueAsString(user); //由于@ResponseBody注解,这里会将str转成json格式返回;十分方便 return str; } }
结果:
{"name":"王泽""age":3,"sex":"男"}
JSON乱码统一解决
@RestController = @Controller+@ResponseBody
可以通过Spring配置统一指定,这样就不用每次都去处理了!我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!
<mvc:annotation-driven>
<mvc:message-converters register-defaults="true">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"/>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper">
<bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
<property name="failOnEmptyBeans" value="false"/>
</bean>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
3.输出集合与对象
输出集合
@RequestMapping("/json2")
public String json2() throws JsonProcessingException {
//创建一个jackson的对象映射器,用来解析数据
ObjectMapper mapper = new ObjectMapper();
//创建一个对象
User user1 = new User("张三", 3, "男");
User user2 = new User("李四", 3, "男");
User user3 = new User("王五", 3, "男");
User user4 = new User("萨斯给", 3, "男");
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//将我们的对象解析成为json格式
String str = mapper.writeValueAsString(list);
return str;
}
输出对象
@RequestMapping("/json3")
public String json3() throws JsonProcessingException {
ObjectMapper mapper = new ObjectMapper()小白都能看懂的SQL零基础入门,一文带你轻松学会增删改查!