构建 Spring Web 应用程序

在这里插入图片描述

搭建Spring MVC
配置DispatcherServlet

Java 配置

public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {RootAppConfig.class};
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] {WebAppConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}
  • 扩展AbstractAnnotationConfigDispatcherServletInitializer的任意类都会自动地配置DispatherServlet和Spring应用上下文,Spring的应用上下文会位于应用程序的Servlet上下文之中。

在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果能发现的话,就会用它来配置Servlet容器。
Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer实现,也就是AbstractAnnotationConfigDispatcherServletInitializer,我们自定义的类扩展了它,也就实现了WebApplicationInitializer,因此部署到Servlet3.0容器中时,容器会自动发现它,并用它来配置Servlet上下文。

  • getServletMappings() 将一个或多个路径映射到DispatcherServlet上
  • getServletConfigClasses() 方法返回的带有@Configuration注解的类将会用来定义DispatcherServlet应用上下文中的bean
  • getRootConfigClasses() 方法返回的带有@Configuration注解的类将会用来配置ContextLoaderListener创建应用上下文中的bean
启动SpringMVC
<mvc:annotation-driven />

@Configuration
@EnableWebMvc
public class WebConfig {
}

SpringMVC基本配置

@Configuration
@EnableWebMvc
@ComponentScan("com.websocket")
public class WebAppConfig extends WebMvcConfigurerAdapter {
	
	//配置jsp视图解析器
    @Bean
    public ViewResolver viewResolver() {  
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/jsp/");
        viewResolver.setSuffix(".jsp");
        viewResolver.setExposeContextBeansAsAttributes(true);
        return viewResolver;
    }

	//配置静态资源的处理
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

https://stackoverflow.com/questions/9177926/unable-to-retrieve-properties-with-exposecontextbeansasattributes

  • 通过调用DefaultServletHandlerConfigurer 的enable方法,我们要求DispatcherServlet将对静态资源的请求转发到Servlet容器中默认的Servlet上,而不是使用DispatcherServlet本身来处理此类请求。
@Configuration
@ComponentScan(basePackages = {"com.websocket"},
        excludeFilters = {@Filter(type = FilterType.ANNOTATION, value = EnableWebMvc.class)})
public class RootAppConfig {
}

测试控制器1


通过路径参数接收输入

@RequestMapping(value = "/show", method = RequestMethod.GET)
public String showSpittle(@RequestParam("spittle_id") long spittleId, Model model) {
	... //use spittleId
}
  • 这个处理器方法将会处理形如/show?spittle_id=123这样的请求

为了实现/show/123路径变量,Spring允许我们在@RequestMapping路径中添加占位符,占位符名称需要用大括号括起来。路径中的其他部分要与所处理的请求完全匹配,但是占位符可以是任意的值

@RequestMapping(value = "/show/{spittleId}", method = RequestMethod.GET)
public String showSpittle(@PathVariable("spittleId") long spittleId, Model model) {
	... //use spittleId
}
  • 如果方法参数名和占位符名称相同,我们可以去掉@PathVariable中的value属性
    public String showSpittle(@PathVariable long spittleId, Model model) {}

InternalResourceViewResolver 可以识别 redirect:forword: 前缀:

@RequestMapping(...)
public String ...(...) {
	...
	return "redirect:...";  //重定向到...
}

使用Java 校验API所提供的校验注解 校验参数
SpringMVC中提供了对Java 校验 API的支持。Java API定义了多个注解,这些注解可以放到属性上,从而限制这些属性的值。所有注解都位于javax.validation.constraints包中

  • @AssertFalse 所注解的元素必须是boolean类型,并且值为false
  • @AssertTrue ……true
  • @DecimalMax 所注解的元素必须是数字,并且它的值要小于或等于给定的BigDecimalString值
  • @DecimalMin ……大于或等于……
  • @Digits 所注解的元素必须是数字,并且它的值必须有指定的位数
  • @Max 所注解的元素必须是数字,并且它的值要小于或等于给定的值
  • @Min ……大于或等于……
  • @NotNull 所注解的元素的值不能为null
  • @Null ……必须为null
  • @Future 所注解的元素的值必须是一个将来的日期
  • @Past ……已过去的日期
  • @Pattern 所注解的元素的值必须匹配给定的正则表达式
  • @Size 所注解的元素的值必须是String、集合或数组,并且它的长度要符合给定的范围
public class Spitter {
	@NotNull
	@Size(min=5, max=16)
	private String username;
	
	@NotNull
	@Size(min=5, max=25)
	private String password;
	
	...
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String processRegistration(@Valid Spitter spitter, Errors errors) {
	if(errors.hasErrors()) { //校验出现错误
		return "registerForm";
	}
	...
}
  • 控制器方法接收对象作为参数,对象的属性将会使用请求中同名的参数进行填充
  • 如果校验出现错误的话,那么这些错误可以通过Errors对象进行访问
  • Errors参数要紧跟在带有@Valid注解的参数后面
  • 如果有错误的话,errors.hasErrors()将会返回到registerForm
//Lang 包的方法
EqualsBuilder.reflectionEquals()  //重写equals方法
HashCodeBuilder.reflectionHashCode()  //重写hashCode方法

  1. p145 ↩︎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值