重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
SpringMVC是一种基于Java实现MVC模型的轻量级Web框架。
创新互联建站从2013年创立,先为大柴旦等服务建站,大柴旦等地企业,进行企业商务咨询服务。为大柴旦企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。创建web工程(Maven结构) 设置tomcat服务器插件tomcat7进行get请求时会有中文乱码问题(8.5版本后没有这个问题)这里要配置字符集:
导包
org.apache.tomcat.maven tomcat7-maven-plugin
2.1
80
/
UTF-8
spring-webmvc坐标自动依赖spring相关坐标
javax.servlet javax.servlet-api
3.1.0
provided
org.springframework spring-webmvc
5.2.10.RELEASE
当发送json数据时要导这个包:
代码
com.fasterxml.jackson.core jackson-databind
2.9.0
@Configuration初始化SpringMVC环境(同Spring环境)
@ComponentScan加载SpringMVC对应的bean
在spring3.0后web-inf下的web.xml就可以被配置类替代了。
//spring不是一定要定义,写出来只是为了便于理解后面的bean多次加载问题
//@Configuration
//@ComponentScan
//public class SpringConfig {
//}
@Configuration
@ComponentScan("com.xxz.controller")
public class SpringMvcConfig {
}
创建SpringMVC控制器类(等同于Servlet功能)
SpringMVC中,/save这样的映射是放在一起统一管理的,并不是放在每一个bean里自己管理。
@ResponseBody在这里必须加,得告诉前端我给你的是body里的数据,而不是要跳转到哪个资源路径,如果返回的是字符串,那直接给前端,如果是对象或集合,那就转成json这种前端能识别的数据格式。功能由我们前面导入的json相关包的HttpMessageConvert接口定义。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/save")
@ResponseBody
public String save(@ ){
System.out.println("user save ...");
return "{'info':'springmvc'}";
}
}
createServletApplicationContext()是指定SpringMVC的容器,new AnnotationConfigWebApplicationContext();是创建SpringMVC的容器,
getServletMappings是指定进入web的容器中的请求中,哪些请求走SpringMVC,而/就表示全部
createRootApplicationContext()创建非SpringMVC的的容器对象,这里就是spring容器。
public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer { protected WebApplicationContext createServletApplicationContext() { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
ctx.register(SpringMvcConfig.class);
return ctx;
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected WebApplicationContext createRootApplicationContext() {
//AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
//ctx.register(SpringConfig.class);
//return ctx;
}
}
简化写法:
运行public class ServletContainersInitConfig extends AbstractAnnotationConfigDispatcherServletInitializer{
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
protected String[] getServletMappings() {
return new String[]{"/"};
}
protected Class>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
// 配字符编码过滤器,解决post请求中文参数乱码问题。
protected Filter[] getServletFilters() {
CharacterEncodingFilter filter = new CharacterEncodingFilter(); filter.setEncoding("utf-8");
return new Filter[]{filter}; //多个过滤器用,分隔就行
}
}
找到Idea上面的Application处,搜mavan,在下方填command line写tomcat,选run选项的。
拓展 bean重复加载问题spring和SpringMVC都指定了componentscan,都指定了扫描包,都会把bean加载出来,当一个bean在两个范围中时,都会加载一遍。
所以要想办法避免,最简单的非代码方式是将两config类挪位置,比如本来在com.xxx,那么可以挪到com或com的上一级。
代码手段:
在spring容器中,采取过滤器的方式,采用注解过滤的方式,过滤掉带@Controller的文件
请求参数接收问题 地址栏后面拼接的参数:@Configuration
@ComponentScan(value = "com.itheima",
excludeFilters = @ComponentScan.Filter(
type = FilterType.ANNOTATION,
classes = Controller.class
)
)
public class SpringConfig {
}
普通参数:接口参数名与请求的参数一致的自动映射接收
POJO类型参数:bean属性名与请求的参数一致的自动映射接收
嵌套POJO类型参数:请求参数采取bean对象成员属性.对象成员属性的方式请求
如果在嵌套关系中,被引用的对象成员名为A,那就是A.A的对象成员属性
数组类型参数:请求的参数名多写几个就行
接口的接收方法(String[] names)
集合类型参数:框架看到List以为是个引用类型,要帮我们创建对象,但List是接口,没有构造,所以会报init错误,前面加上@RequestParam让框架直接装数据就行了,不在这里进行对象创建。
接口的接收方法(@RequestParam List
日期数据:?date=2088/08/08&date1=2088-08-18&date2=2088/08/28 8:08:08
yyyy/MM/dd格式是默认可以接收的,所以直接:接口的接收方法(Date date)
另外的不是,要加:@DateTimeFormat,由spring-core的Convert接口定义的方法:
接口的接收方法(@DateTimeFormat(pattern = "yyyy-MM-dd") Date date1)
接口的接收方法(@DateTimeFormat(pattern = "yyyy/MM/dd HH:mm:ss") Date date2)
body中的json请求数据:postman中的位置:body/raw/json
@EnableWebMvc作用是将请求的json转成对象(自动类型转换)
@Configuration
@ComponentScan("com.itheima.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
接收请求中的json数据:@RequestBody
接口的接收方法(@RequestBody List
接口的接收方法(@RequestBody Pojo pojp)
接口的接收方法(@RequestBody List
@RequestParam用于接收url地址传参,表单传参【application/x-www-form-urlencoded】 @RequestBody用于接收json数据【application/json】
非json格式数据,选用@RequestParam接收请求参数。
后面开发以json格式数据为主,@RequestBody应用范围更广。
响应 响应文本数据@ResponseBody不加的话,返回的字符串会被当做跳转地址
响应POJO对象@RequestMapping("/toText")
@ResponseBody
public String toText(){
System.out.println("返回纯文本数据");
return "response text";
}
响应POJO集合对象@RequestMapping("/toJsonPOJO")
@ResponseBody
public User toJsonPOJO(){
System.out.println("返回json对象数据");
User user = new User();
user.setName("xxz");
user.setAge(15);
return user;
}
REST风格@RequestMapping("/toJsonList")
@ResponseBody
public List
toJsonList(){ System.out.println("返回json集合数据");
User user1 = new User();
user1.setName("名字");
user1.setAge(15);
User user2 = new User();
user2.setName("名字");
user2.setAge(12);
List
userList = new ArrayList (); userList.add(user1);
userList.add(user2);
return userList;
}
原来访问路径形式:
http://localhost/user/getById?id=1
http://localhost/user/saveUser
REST风格访问路径形式:
http://localhost/user/1
http://localhost/user
隐藏了接口的部分信息(请求方式和参数名),更加简洁。
多种请求方式如GET、PUT、POST等,对同一个路径的请求还可以用来访问不同的接口。
案例在Controller中定义方法时设定http请求方式"和请求请求参数(路径变量
简化写法:@Controller
public class UserController {
//当前请求方法为POST,表示REST风格中的添加操作
@RequestMapping(value = "/users",method = RequestMethod.POST)
@ResponseBody
public String save(){
System.out.println("user save...");
return "{'module':'user save'}";
}
//当前请求方法为DELETE,表示REST风格中的删除操作
//@PathVariable注解用于绑定路径参数与处理器方法形参间的关系,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}",method = RequestMethod.DELETE)
@ResponseBody
public String delete(@PathVariable Integer id){
System.out.println("user delete..." + id);
return "{'module':'user delete'}";
}
//当前请求方法为PUT,表示REST风格中的修改操作
@RequestMapping(value = "/users",method = RequestMethod.PUT)
@ResponseBody
public String update(@RequestBody User user){
System.out.println("user update..."+user);
return "{'module':'user update'}";
}
//当前请求方法为GET,表示REST风格中的查询操作
//@PathVariable注解用于设置路径变量(路径参数),要求路径上设置对应的占位符,并且占位符名称与方法形参名称相同
@RequestMapping(value = "/users/{id}" ,method = RequestMethod.GET)
@ResponseBody
public String getById(@PathVariable Integer id){
System.out.println("user getById..."+id);
return "{'module':'user getById'}";
}
//当前请求方法为GET,表示REST风格中的查询操作
@RequestMapping(value = "/users",method = RequestMethod.GET)
@ResponseBody
public String getAll(){
System.out.println("user getAll...");
return "{'module':'user getAll'}";
}
}
静态资源放行:@RestController //使用@RestController注解替换@Controller与@ResponseBody注解,简化书写
@RequestMapping("/books")
public class BookController {
// @RequestMapping( method = RequestMethod.POST)
@PostMapping//使用@PostMapping简化Post请求方法对应的映射配置
public String save(@RequestBody Book book){
System.out.println("book save..." + book);
return "{'module':'book save'}";
}
// @RequestMapping(value = "/{id}" ,method = RequestMethod.DELETE)
@DeleteMapping("/{id}") //使用@DeleteMapping简化DELETE请求方法对应的映射配置
public String delete(@PathVariable Integer id){
System.out.println("book delete..." + id);
return "{'module':'book delete'}";
}
// @RequestMapping(method = RequestMethod.PUT)
@PutMapping //使用@PutMapping简化Put请求方法对应的映射配置
public String update(@RequestBody Book book){
System.out.println("book update..."+book);
return "{'module':'book update'}";
}
// @RequestMapping(value = "/{id}" ,method = RequestMethod.GET)
@GetMapping("/{id}") //使用@GetMapping简化GET请求方法对应的映射配置
public String getById(@PathVariable Integer id){
System.out.println("book getById..."+id);
return "{'module':'book getById'}";
}
// @RequestMapping(method = RequestMethod.GET)
@GetMapping //使用@GetMapping简化GET请求方法对应的映射配置
public String getAll(){
System.out.println("book getAll...");
return "{'module':'book getAll'}";
}
}
@Configuration
public class SpringMvcSupport extends WebMvcConfigurationSupport {
//设置静态资源访问过滤,当前类需要设置为配置类,并被扫描加载
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
//当有请求访问/pages/**时候,从/pages目录下查找内容
registry.addResourceHandler("/pages/**")
.addResourceLocations("/pages/");
registry.addResourceHandler("/js/**")
.addResourceLocations("/js/");
registry.addResourceHandler("/css/**")
.addResourceLocations("/css/");
registry.addResourceHandler("/plugins/**")
.addResourceLocations("/plugins/");
}
}
在主配置上添加扫描:
@Configuration
@ComponentScan({"com.itheima.controller","自定义的SpringMvcSupport 所在的包路径"})
@EnableWebMvc
public class SpringMvcConfig {
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧