【Spring in action】基于Java配置SpringMVC中使用Spring及SpringMVC各种请求详解

来源:互联网 发布:爆伤和黄字算法 编辑:程序博客网 时间:2024/05/17 07:09

一、基于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{@Beanpublic ViewResolver viewResolver(){InternalResourceViewResolver resolver = new InternalResourceViewResolver();resolver.setPrefix("/WEB-INF/views/");resolver.setSuffix(".jsp");resolver.setExposeContextBeansAsAttributes(true);return resolver;}@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {// TODO Auto-generated method stubconfigurer.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;@Componentpublic class DefaultRespository implements SpittleRepository {@Overridepublic 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 {@AutowiredSpittleRepository 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 {@AutowiredSpittleRepository 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";}
写了一个Spitterspitter对象刚好用来接收数据。一一匹配。
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>

























阅读全文
0 0