【Spring in action】基于Java配置SpringMVC中使用Spring及SpringMVC各种请求详解
程序员文章站
2024-02-15 12:01:23
...
一、基于Java配置SpringMVC中使用Spring简介
在【Spring in action】SpringMVC基于xml及java配置的简单运用(文章链接) 中,已经提过SpringMVC的基于java配置。
如何springmvc结合Spring也基于Java配置呢?相对于【Spring in action】基于xml配置:在SpringMVC中使用Spring容器 (文章链接)要简单许多。
二、回顾一下:根据 SpringMVC基于xml及java配置的简单运用 一文我们知道 以下三个类的对应关系。
1、web.xml对应:RootConfig.class;
package spittr.config;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
@Configuration
@ComponentScan(basePackages={"spittr","com"},excludeFilters={@Filter(type=FilterType.ANNOTATION,value=EnableWebMvc.class)})
public class RootConfig {
}
@ComponentScan其中包含一个basePackages={"spittr","com"}指的是什么意思?即会自动扫描这两个文件夹下所有@Component注释组件,生成容器Bean。
2、springmvc-servlet.xml对应WebConfig.class
package spittr.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter{
@Bean
public ViewResolver viewResolver(){
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
resolver.setExposeContextBeansAsAttributes(true);
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// TODO Auto-generated method stub
configurer.enable();
}
}
其中@ComponentScan("spittr.web")指的是扫描spittr.web包下所有@Controller注释并生成控制器对应关系。
3、AbstractAnnotationConfigDispatcherServletInitializer的实现类即初始化的时候必然执行的类。
我认为可以理解为初始化类main。在其中引用上面两个类RootConfig、WebConfig。
三、SpringMVC结合Spring通过Java配置:
只需要在rootConfig的路径中添加需要扫描的Spring容器的路径即可。例如我们在com包(com包已经被扫描)下写一个接口,及其实现类。
package com;
import java.util.List;
import spittr.model.Spittle;
public interface SpittleRepository {
List<Spittle> findSpittles(long max,int count);
}
实现类如下:我这里直接通过实现类生成数据。以方便SpringMVC使用。也可以通过实现类去数据库取数据等方式获取数据。
package com;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Component;
import spittr.model.Spittle;
@Component
public class DefaultRespository implements SpittleRepository {
@Override
public List<Spittle> findSpittles(long max, int count) {
List<Spittle> spittles = createSpittlesList(count);
return spittles;
}
private List<Spittle> createSpittlesList(int count) {
List<Spittle> spittles = new ArrayList<>();
for (int j = 0; j < count; j++) {
spittles.add(new Spittle("spittles"+j,new Date()));
}
return spittles;
}
}
四、写一个Controller,通过依赖注入生成对象。
package spittr.web;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.SpittleRepository;
@Controller
@RequestMapping("/spitter")
public class SpittleController {
@Autowired
SpittleRepository spittleRepository;
@RequestMapping(value="/list",method=RequestMethod.GET)
public String sppitles(Model model){
model.addAttribute("spittleList",spittleRepository.findSpittles(Long.MAX_VALUE, 2).toString());
return "spittles";
}
}
并同时写一个spittles.jsp用来展示。我这就简单展示一下即可。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Spitter</title>
<body>
<h1>${spittleList}</h1>
</body>
</html>
测试一下,成功。五、SpringMVC各种请求详解
之前都是通过一个存粹的路径/spitter/list,get请求返回一个jsp地址。但,日常生活中,我们一般请求有两种get请求和post请求都是含有请求参数的。
1、get请求:
@Controller
@RequestMapping("/spittles")
public class SpittleController {
@Autowired
SpittleRepository spittleRepository;
@RequestMapping(value="/list",method=RequestMethod.GET)
public String sppitles(Model model){
model.addAttribute("spittleList",spittleRepository.findSpittles(Long.MAX_VALUE, 2).toString());
return "spittles";
}
//Get请求一
@RequestMapping(value="/paramsInput",method=RequestMethod.GET)
public List<Spittle> sppitlesParams(@RequestParam(value="count",defaultValue="20")int count){
return spittleRepository.findSpittles(Long.MAX_VALUE, count);
}
}
通过http://localhost:8080/SpringMVCDemo/spitter/paramsInput请求,由于没有指定jsp地址。会默认寻找WEB-INF/views/下spittles文件夹(因为路径spittles)下的
paramsInput.jsp文件。如下:
可能会觉得还是没有传递入参和之前并没有什么不同,因为此处入参设置有默认值。可通过,自己拼接的方式请求:http://localhost:8080/SpringMVCDemo/spittles/paramsInput?count=1
得到一条结果的数据展示。
另一个疑问是:此处返回值为List<Spittle>,并且我们没有指定对应的key。所以按理说jsp是不应该识别的。但是它有默认的命名方式。例如本例的List<Spittle>则命名为spittleList。
此种方式虽然简洁,但是容易出错,建议还是使用下一种方式。
//Get请求二
@RequestMapping(value="/{params}",method=RequestMethod.GET)
public String sppitlesPath(@RequestParam(value="count",defaultValue="20")int count,Model model){
model.addAttribute("spittler",spittleRepository.findSpittles(Long.MAX_VALUE, count));
return "spittles";
}
此种方式精确的指定位置为WEB-INF/views/下的spittles.jsp。传递进去的参数名为spittler。不容易出错。个人偏爱。
但是这种spittles/paramsInput?count = 1的拼接方式可能有人觉得麻烦。有些人更喜欢这种http://localhost:8080/SpringMVCDemo/spittles/5根据路径传递参数的方式(本例传递count为5)。
//Get请求三
@RequestMapping(value="/{spittleId}",method=RequestMethod.GET)
public String sppitlesPath2(@PathVariable("spittleId") int spittleId,Model model){
model.addAttribute("spittler",spittleRepository.findSpittles(Long.MAX_VALUE, spittleId));
return "spittles";
}
2、post请求:
写一个get请求先:
//Get请求
@RequestMapping(value="/jack",method=RequestMethod.GET)
public String jactRequest(){
return "postdemo";
}
指向一个网页:同样,我也可以在此处指定action,如果指定action="jackpost",那么会去找mapping为spittles/jackpost的post请求。(注意必然是spittles下的,因为jack请求就在其下)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Register</h1>
<form method="post">
First Name:<input type="text" name="firstName"><br>
Last Name:<input type="text" name="lastName"><br>
UserName:<input type="text" name="userName"><br>
Password:<input type="text" name="password"><br>
<input type="submit" value="register">
</form>
</body>
</html>
由于post请求没有action则默认当前路径(同路径和上面的Get请求)的post请求。
//Post请求
@RequestMapping(value="/jack",method=RequestMethod.POST)
public String redirectPath(Spitter spitter,Model model){
model.addAttribute(spitter);
return "showinfo";
}
写了一个Spitter
spitter对象刚好用来接收数据。一一匹配。public class Spitter implements Serializable{
@NotNull
@Size(min=2,max=12)
private String userName;
@NotNull
@Size(min=5,max=12)
private String firstName;
@NotNull
@Size(min=5,max=12)
private String lastName;
@NotNull
@Size(min=5,max=12)
private String password;}
简单展示showinfo.jsp如下:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>name</h1>
<h1>${spitter.userName}</h1>
</body>
</html>
上一篇: MYSQL在默认的情况下查询不区分大小写