欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【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>
测试一下,成功。
【Spring in action】基于Java配置SpringMVC中使用Spring及SpringMVC各种请求详解

五、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文件。如下:
【Spring in action】基于Java配置SpringMVC中使用Spring及SpringMVC各种请求详解
可能会觉得还是没有传递入参和之前并没有什么不同,因为此处入参设置有默认值。可通过,自己拼接的方式请求: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>