springmvc配置
自定义类实现WebApplicationInitializer接口,并实现该接口中的onStartup方法,该方法在Spring容器启动之后就会被自动调用,然后创建AnnotationConfigWebApplicationContext的实例并加载我们的SpringMVC的配置文件
最后创建DispatcherServlet,并设置映射方式以及启动时机等
public class WebInit implements WebApplicationInitializer {
public void onStartup(ServletContext servletContext) throws ServletException {
AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
context.register(MVCConfig.class);
context.setServletContext(servletContext);
ServletRegistration.Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(context));
servlet.addMapping("/");
servlet.setLoadOnStartup(1);
}
}
@Configuration
//@EnableWebMvc表示开启SpringMVC中一些默认配置
@EnableWebMvc
@ComponentScan("com.pkg")
public class MVCConfig extends WebMvcConfigurerAdapter{
@Bean
//ViewResolver是SpringMVC视图渲染的核心机制,SpringMVC框架中有一个ViewResolver接口,该接口有一个方法叫做resolveViewName,该方法返回一个View对象,这个View的职责就是结合request、response对象,将渲染的视图返回给浏览器,渲染后的视图可以是HTML,也可以是json、xml、PDF等。另外,由于项目编译之后运行的时候,index.jsp 文件是处于/WEB-INF/classes/views/目录下的,所以前缀为/WEB-INF/classes/views/。
public InternalResourceViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/classes/views/");
viewResolver.setSuffix(".jsp");
viewResolver.setViewClass(JstlView.class);
return viewResolver;
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("/index");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//两个*表示以/assets开始的任意层级的路径都可以访问得到图片,如<img src="../assets/img/1.png">
//一个*表示只可以访问assets目录下的图片文件
registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");
}
}
//@Controller注解声明这是一个控制器,在前面的文章中我们说过@Controller和@Service等可以混用,但是在使用SpringMVC时声明控制器Bean的时候,却只能够使用@Controller
@Controller
//@RequestMapping这个注解我们可以使用在类上,也可以使用在方法上,如果用在方法上,则方法上的路径会继承类上的路径,另一方面,使用了@RequestMapping注解的方法也可以添加request或者response参数。
@RequestMapping("/index1")
public class HelloController {
@RequestMapping("/index2")
public String hello(HttpServletRequest request) {
System.out.println(request.getParameter("username"));
return "index";
}
}
//1.@ResponseBody 这个注解可以让我们将返回值放在response体内,而不是返回一个html页面,当我们在移动端比如Android、或者通过Ajax来访问服务端的数据的时候,就可以通过这个注解。
//2.@RequestBody 这个注解允许request的参数在request体中,而不是直接放在地址后面。
//3.@PathVariable 这个注解用来接收路径参数
//4.@RestController 这是一个组合注解,组合了@Controller和@ResponseBody两个,在开发中我们可以用@RestController这一个,也可以用后面两个,使用这个可以自动将一个对象转为xml或者json返回给客户端。
//不同路径定位到同一方法,
@RequestMapping(value = {"/n1","/n2"},produces = "text/plain;charset=UTF-8")
//取url值
//http://localhost:8080/user/user/张三
@ResponseBody
@RequestMapping(value = "/user/{str}",produces = "text/plain;charset=UTF-8")
public String pathVar(@PathVariable String str, HttpServletRequest request) {
//url:http://localhost:8080/user/user/%E5%BC%A0%E4%B8%89 can access , str is 张三
return "url:" + request.getRequestURL() + " can access , str is " + str;
}
//取参数值
//http://localhost:8080/user/rp?id=100
@ResponseBody
@RequestMapping(value = "/rp",produces = "text/plain;charset=UTF-8")
public String requestParams(long id, HttpServletRequest request) {
//url:http://localhost:8080/user/rp can access , username is :100
return "url:" + request.getRequestURL() + " can access , username is :" + id;
}
//取值到bean
//http://localhost:8080/user/json?username=%E5%BC%A0%E4%B8%89&password=123
@ResponseBody
@RequestMapping(value = "/json", produces = "application/json;charset=UTF-8")
public String passObj(UserBean user, HttpServletRequest request) {
Gson gson = new Gson();
//{"username":"张三","password":"123"}
return gson.toJson(user);
}
1.方法中的参数是任意的,可以有可以无,也可以有HttpServletRequest和HttpServletResponse类型的参数,使用方式和Servlet中一致。
2.参数可以接收基本数据类型和任何对象。如果是对象,比如我在客户端传递参数时可以传递http://localhost:8080/user/json?username=%E5%BC%A0%E4%B8%89&password=123,这个时候系统会自动将最后两个参数转为一个UserBean对象交给我。
3.@PathVariable注解可以帮助我们提取请求地址中的字段
4.@RequestMapping注解中的value可以有多个值,这样可以实现多个地址请求到同一个方法。
5.如果想给服务端返回一个json字符串或者xml字符串,直接返回一个对象即可,至于这个对象最终会被转为json还是xml,我们可以通过produces = "application/json;charset=UTF-8"或者produces = "application/xml;charset=UTF-8"来定义。
//添加拦截器 在public class MVCConfig extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptors());
}
@Bean
public MyInterceptors myInterceptors() {
return new MyInterceptors();
}
//拦截器
public class MyInterceptors implements HandlerInterceptor {
//preHandle方法发生在请求发生前执行
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
System.out.println("preHandle");
return true;
}
//postHandle发生在请求发生后执行
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle");
}
//afterCompletion在请求完成时执行,实际上执行时机紧挨着postHandle这个方法
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
System.out.println("afterCompletion");
}
}
全局资源的配置问题,我们可以通过@ControllerAdvice来把控制器的全局配置放在同一个位置,这样我们可以统一处理下面几个问题:
1 .全局异常处理
2 .预设键值对绑定到Model中
3 .预处理前台请求参数
@ControllerAdvice
public class ExceptionHandlerAdvice {
//@ExceptionHandler用来设置拦截条件,这里表示拦截所有的Exception
@ExceptionHandler(value = Exception.class)
首先通过@ControllerAdvice声明一个控制器建言,由于这个注解组合了@Component注解,这个这个类会自动注册为Spring容器中的Bean。@ExceptionHandler可以定义全局处理,其中Value属性用来表示过滤拦截条件,Exception.class表示拦截所有的Exception。
ModelAndView时传入的error表示出错的页面。OK,我们来看一下控制器,我在控制器中添加如下方法:
@RequestMapping("/user")
public String user(@ModelAttribute("msg") String msg, UserBean userBean) {
System.out.println("username is :" + userBean.getUsername() + ";and id is :" + userBean.getId());
throw new IllegalArgumentException("抱歉,参数异常/ 来自@ModelAttribute:" + msg);
}
当我访问/user这个地址的时候,直接抛一个异常,这个异常会被使用了@ExceptionHandler注解并且满足过滤条件的方法接收并处理,我们这里当然是来到了exception这个方法中,在这个方法中我们又定位到了error.jsp页面。
同时这里的参数还使用了@ModelAttribute注解
public String user(@ModelAttribute("msg") String msg, UserBean userBean)
这个时候我们可以在ExceptionHandlerAdvice类中再添加一个方法:
@ModelAttribute
public void addAttributes(Model model) {
model.addAttribute("msg", "额外信息");
}
在这个方法中我们向Model中绑定键值对,绑定完成之后,在任何Controller中我们都可以通过给方法的参数设定@ModelAttribute注解来访问这里存入的值,相当于这里的值是一个全局变量。
这个表示将客户端传来的id参数忽略掉,但是注意接收的方式,这里通过对象来接收参数的时候才有效(通过对象接收这个参数的时候才会屏蔽掉id),如果直接提取还是可以提取到的
@InitBinder
public void initBinder(WebDataBinder webDataBinder) {
webDataBinder.setDisallowedFields("id");
}
http://blog.csdn.net/u012702547/article/details/53695789
浙公网安备 33010602011771号