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

一、基于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>
测试一下,成功。

五、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文件。如下:
可能会觉得还是没有传递入参和之前并没有什么不同,因为此处入参设置有默认值。可通过,自己拼接的方式请求: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>

























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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值