一、开始一个SpringMVC项目
1.配置DispatcherServlet
DispatcherServlet是Spring MVC的核心。 在这里请求会第一次接触到框架, 它要负责将请求路由到其他的组件之中。
请求路径
- java类配置
配置DispatcherServletpublic class SpitterWebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { //ContextLoaderListener创建应用上下文,加载应用中的其他bean。这些bean通常是驱动应用后端的中间层和数据层组件。 @Override protected Class<?>[] getRootConfigClasses() { return new Class<?>[] { RootConfig.class }; } //DispatcherServlet加载应用上下文时,加载包含Web组件的bean。 如控制器、 视图解析器以及处理器映射。 @Override protected Class<?>[] getServletConfigClasses() { return new Class<?>[] { WebConfig.class }; } //将DispatcherServlet映射到“/” @Override protected String[] getServletMappings() { return new String[] { "/" }; } }
但是,这种方式只能部署到支持Servlet 3.0的服务器中才能正常工作, 如Tomcat 7或更高版本。
- web.xml配置
- 启用Spring MVC
- java类注解方式
创建一个带有@EnableWebMvc注解的类:
WebConfig
RootConfig@Configuration //启用Spring MVC @EnableWebMvc //启用组件扫描 @ComponentScan("spittr.web") public class WebConfig extends WebMvcConfigurerAdapter { //配置JSP视图解析器 @Bean public ViewResolver viewResolver() { InternalResourceViewResolver resolver = new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/"); resolver.setSuffix(".jsp"); return resolver; } //配置静态资源的管理 @Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { configurer.enable(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // TODO Auto-generated method stub super.addResourceHandlers(registry); } }
@Configuration @Import(DataConfig.class) //启用组件扫描 @ComponentScan(basePackages={"spittr"}, excludeFilters={ @Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class) }) public class RootConfig {}
- xml配置
二、SpringMVC简单操作
- 编写基本的控制器
- 接受请求的输入
- 处理表单
- 编写基本的控制器
添加@RequestMapping注解
-
添加@Controller注解
//声明为一个控制器,基于@Component注解 @Controller //声明处理对"/"的GET请求 @RequestMapping("/") public class HomeController { @RequestMapping(method = GET) public String home(Model model) { //视图名为home return "home"; } } 视图名“home”将会解析为“/WEB-INF/views/home.jsp”路径的JSP。 homepage与a相同 @RequestMapping({"/a","/homepage"})
Model实际上就是一个Map(也就是 key-value对的集合) , 它会传递给视图, 这样数据就能渲染到客户端了。 当调用addAttribute()方法并且不指定key的时候, 那么key会根据值的对象类型推断确定。 在本例中, 因为它是一 个List<Spittle>, 因此, 键将会推断为spittleList。
//添加模型参数 @RequestMapping(method=RequestMethod.GET) public String spittle(Model model) { model.addAttribute(createSpittleList(20)); return "spittles"; } private List<Spittle> createSpittleList(int count) { List<Spittle> spittles = new ArrayList<Spittle>(); for (int i=0; i < count; i++) { spittles.add(new Spittle("Spittle " + i, new Date())); } return spittles; }
当要显示指定key时,可以这样做
@RequestMapping(method=RequestMethod.GET) public String spittle(Model model) { model.addAttribute("spittleList",createSpittleList(20)); return "spittles"; }
在jsp中访问数据
<c:forEach items="${spittleList}" var="spittle" > <li id="spittle_<c:out value="spittle.id"/>"> <div class="spittleMessage"><c:out value="${spittle.message}" /></div> <div> <span class="spittleTime"><c:out value="${spittle.time}" /></span> <span class="spittleLocation">(<c:out value="${spittle.latitude}" />, <c:out value="${spittle.longitude}" />)</span> </div> </li> </c:forEach>
- 接受请求的输入
Spring MVC允许以多种方式将客户端中的数据传送到控制器的处理器方法中, 包括:
- 查询参数(Query Parameter)
- 表单参数(Form Parameter)
- 路径变量(Path Variable)
查询参数
```
@RequestMapping(method=RequestMethod.GET)
public String spittle(@RequestParam(value="max1")long max,
@RequestParam(value="count1")int count1, Model model) {
model.addAttribute(createSpittleList(20));
return "spittles";
}
//浏览器访问:
http://localhost:8080/spittrtest/spittles?max1=238900&count1=50
路径参数
@RequestMapping(value="/{spittleId}",method=RequestMethod.GET)
public String spittle(@PathVariable int spittleId,Model model) {
model.addAttribute(createSpittle(spittleId));
return "spittle";
}
- 处理表单
@Controller
@RequestMapping("/spitter")
public class SpitterController {
private SpitterRepository spittlerRepository;
@Autowired
public SpitterController(SpitterRepository spitterRepository) {
this.spittlerRepository = spitterRepository;
}
@RequestMapping(value="/register", method=GET)
public String showRegistrationForm() {
return "registerForm";
}
@RequestMapping(value="/register", method=POST)
public String processRegistration(Spitter spitter) {
System.out.println("保存注册信息");
return "redirect:/spitter/"+spitter.getUsername();
}
@RequestMapping(value="/{username}",method=GET)
public String showSpitterProfile(@PathVariable String username,Model model) {
System.out.println("模拟一个注册用户");
Spitter spitter = new Spitter();
spitter.setUsername(username);
model.addAttribute(spitter);
return "profile";
}
}
校验表单
//编写需要校验的实体类
public class Spitter {
private Long id;
@NotNull
@Size(min=5, max=16)
private String username;
@NotNull
@Size(min=5, max=25)
private String password;
@NotNull
@Size(min=2, max=30)
private String firstName;
@NotNull
@Size(min=2, max=30)
private String lastName;
@NotNull
@Email
private String email;
}
//编写处理请求的方法
@RequestMapping(value="/register", method=POST)
public String processRegistration(@Valid Spitter spitter,Errors errors) {
if(errors.hasErrors()) {
System.out.println("表单校验出错");
return "registerForm";
}
System.out.println("保存注册信息");
return "redirect:/spitter/"+spitter.getUsername();
}