Mkyong 中文博客翻译(五十七)

原文:Mkyong

协议:CC BY-NC-SA 4.0

Spring ListFactoryBean 示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring/spring-listfactorybean-example/

ListFactoryBean '类为开发人员提供了在 Spring 的 Bean 配置文件中创建具体列表集合类(ArrayList 和 LinkedList)的方法。

这里有一个 ListFactoryBean 的例子,它会在运行时实例化一个 ArrayList,并将其注入到一个 Bean 属性中。

 package com.mkyong.common;

import java.util.List;

public class Customer 
{
    
    
	private List lists;
	//...
} 

Spring 的 bean 配置文件。

 <beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="lists">
			<bean class="org.springframework.beans.factory.config.ListFactoryBean">
				<property name="targetListClass">
					<value>java.util.ArrayList</value>
				</property>
				<property name="sourceList">
					<list>
						<value>1</value>
						<value>2</value>
						<value>3</value>
					</list>
				</property>
			</bean>
		</property>
	</bean>

</beans> 

或者,您也可以使用 util schema 和来实现同样的事情。

 <beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-2.5.xsd">

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="lists">
			<util:list list-class="java.util.ArrayList">
				<value>1</value>
				<value>2</value>
				<value>3</value>
			</util:list>
		</property>
	</bean>

</beans> 

记得包括 util 模式,否则您将遇到以下错误

 Caused by: org.xml.sax.SAXParseException: 
	The prefix "util" for element "util:list" is not bound. 

运行它…

 package com.mkyong.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    
    
	public static void main(String[] args) {
    
    
		ApplicationContext context = new ClassPathXmlApplicationContext(
				"SpringBeans.xml");

		Customer cust = (Customer) context.getBean("CustomerBean");
		System.out.println(cust);

	}
} 

输出

 Customer [lists=[1, 2, 3]] Type=[class java.util.ArrayList] 

您已经实例化了 ArrayList,并在运行时将其注入到 Customer 的 lists 属性中。

下载源代码

Download It – Spring-ListFactoryBean-Example.zip (5KB) ## 参考

  1. ListFactoryBean Javadoc

spring外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190302163354/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

弹簧松耦合示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring/spring-loosely-coupled-example/

面向对象的概念是一个很好的设计,可以把你的系统分成一组可重用的对象。然而,当系统变得越来越大时,尤其是在 Java 项目中,巨大的对象依赖总是紧密耦合的,导致对象很难管理或修改。在这种情况下,您可以使用 Spring framework 作为一个中心模块,轻松有效地管理所有的对象依赖关系。

输出生成器示例

我们来看一个例子,假设你的项目有一个功能,把内容输出到 Csv 或者 Json 格式。您的代码可能类似于以下示例:

文件:IOutputGenerator.java-输出生成器的接口

 package com.mkyong.output;

public interface IOutputGenerator
{
    
    
	public void generateOutput();
} 

文件:CsvOutputGenerator.java——实现 IOutputGenerator 接口的 Csv 输出生成器。

 package com.mkyong.output.impl;

import com.mkyong.output.IOutputGenerator;

public class CsvOutputGenerator implements IOutputGenerator
{
    
    
	public void generateOutput(){
    
    
		System.out.println("Csv Output Generator");
	}
} 

文件:JsonOutputGenerator.java——实现 IOutputGenerator 接口的 Json 输出生成器。

 package com.mkyong.output.impl;

import com.mkyong.output.IOutputGenerator;

public class JsonOutputGenerator implements IOutputGenerator
{
    
    
	public void generateOutput(){
    
    
		System.out.println("Json Output Generator");
	}
} 

有几种方法可以调用 IOutputGenerator,以及如何使用 Spring 来避免对象之间的紧密耦合。

1.方法 1–直接调用它

正常方式,直接调用。

 package com.mkyong.common;

import com.mkyong.output.IOutputGenerator;
import com.mkyong.output.impl.CsvOutputGenerator;

public class App 
{
    
    
    public static void main( String[] args )
    {
    
    
    	IOutputGenerator output = new CsvOutputGenerator();
    	output.generateOutput();
    }
} 

问题如果这段代码分散在你的项目中,那么输出生成器的每一个变化都会让你深受其害。

方法 2–用助手类调用它

您可能会考虑创建一个助手类,将所有输出实现都放入其中。

 package com.mkyong.output;

import com.mkyong.output.IOutputGenerator;
import com.mkyong.output.impl.CsvOutputGenerator;

public class OutputHelper
{
    
    
	IOutputGenerator outputGenerator;

	public OutputHelper(){
    
    
		outputGenerator = new CsvOutputGenerator();
	}

	public void generateOutput(){
    
    
		outputGenerator.generateOutput();
	}

} 

通过助手类调用它。

 package com.mkyong.common;

import com.mkyong.output.OutputHelper;

public class App 
{
    
    
    public static void main( String[] args )
    {
    
    
    	OutputHelper output = new OutputHelper();
    	output.generateOutput(); 
    }
} 

问题
这看起来更优雅,你只需要管理一个助手类,然而助手类仍然与 CsvOutputGenerator 紧密耦合,输出生成器的每一个变化仍然涉及微小的代码变化。

方法 3–弹簧

在这种情况下,Spring 依赖注入(DI)是一个不错的选择。Spring 可以让你的输出生成器松耦合到输出生成器。

OutputHelper 类中的微小变化。

 package com.mkyong.output;

import com.mkyong.output.IOutputGenerator;

public class OutputHelper
{
    
    
	IOutputGenerator outputGenerator;

	public void generateOutput(){
    
    
		outputGenerator.generateOutput();
	}

	public void setOutputGenerator(IOutputGenerator outputGenerator){
    
    
		this.outputGenerator = outputGenerator;
	}
} 

创建一个 Spring bean 配置文件,并在这里声明所有的 Java 对象依赖项。

 <!-- Spring-Common.xml -->
<beans 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="OutputHelper" class="com.mkyong.output.OutputHelper">
		<property name="outputGenerator" ref="CsvOutputGenerator" />
	</bean>

	<bean id="CsvOutputGenerator" class="com.mkyong.output.impl.CsvOutputGenerator" />
	<bean id="JsonOutputGenerator" class="com.mkyong.output.impl.JsonOutputGenerator" />

</beans> 

称之为经由春天

 package com.mkyong.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mkyong.output.OutputHelper;

public class App 
{
    
    
    public static void main( String[] args )
    {
    
    
    	ApplicationContext context = 
    	   new ClassPathXmlApplicationContext(new String[] {
    
    "Spring-Common.xml"});

    	OutputHelper output = (OutputHelper)context.getBean("OutputHelper");
    	output.generateOutput();

    }
} 

现在,您只需要为不同的输出生成器更改 Spring XML 文件。当输出改变时,您只需要修改 Spring XML 文件,不需要修改代码,这意味着更少的错误。

结论

使用 Spring framework——依赖注入(DI)对于对象依赖管理来说是一个有用的特性,它非常优雅、高度灵活并且便于维护,尤其是在大型 Java 项目中。

spring

Spring MapFactoryBean 示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring/spring-mapfactorybean-example/

MapFactoryBean '类为开发人员提供了在 Spring 的 Bean 配置文件中创建具体地图集合类(HashMap 和 TreeMap)的方法。

下面是一个 MapFactoryBean 的例子,它会在运行时实例化一个 HashMap,,并将其注入到一个 Bean 属性中。

 package com.mkyong.common;

import java.util.Map;

public class Customer 
{
    
    
	private Map maps;
	//...
} 

Spring 的 bean 配置文件。

 <beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="maps">
			<bean class="org.springframework.beans.factory.config.MapFactoryBean">
				<property name="targetMapClass">
					<value>java.util.HashMap</value>
				</property>
				<property name="sourceMap">
					<map>
						<entry key="Key1" value="1" />
						<entry key="Key2" value="2" />
						<entry key="Key3" value="3" />
					</map>
				</property>
			</bean>
		</property>
	</bean>

</beans> 

或者,您也可以使用 util schema 和来实现同样的事情。

 <beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:util="http://www.springframework.org/schema/util"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
	http://www.springframework.org/schema/util
	http://www.springframework.org/schema/util/spring-util-2.5.xsd">

	<bean id="CustomerBean" class="com.mkyong.common.Customer">
		<property name="maps">
			<util:map map-class="java.util.HashMap">
				<entry key="Key1" value="1" />
				<entry key="Key2" value="2" />
				<entry key="Key3" value="3" />
			</util:map>
		</property>
	</bean>

</beans> 

记得包括 util 模式,否则您将遇到以下错误

 Caused by: org.xml.sax.SAXParseException: 
	The prefix "util" for element "util:map" is not bound. 

运行它…

 package com.mkyong.common;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App 
{
    
    
    public static void main( String[] args )
    {
    
    
    	ApplicationContext context = new ClassPathXmlApplicationContext("SpringBeans.xml");

    	Customer cust = (Customer)context.getBean("CustomerBean");
    	System.out.println(cust);

    }
} 

输出

 Customer [maps={
    
    Key2=2, Key1=1, Key3=3}] Type=[class java.util.HashMap] 

您已经实例化了一个 HashMap,并在运行时将其注入到 Customer 的 Map 属性中。

下载源代码

Download It – Spring-MapFactoryBean-Example.zip (5KB) ## 参考

  1. MapFactoryBean Javadoc

spring外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190214233817/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

spring+mock ITO–无法模仿 save 方法?

原文:http://web.archive.org/web/20230101150211/https://mkyong.com/spring-boot/spring-mockito-unable-to-mock-save-method/

尝试模仿一个存储库save()方法,但是它总是返回 null?

用 Spring Boot 2 + Spring 数据 JPA 测试的 PS

 @Test
    public void save_book_OK() throws Exception {
    
    

        Book newBook = new Book(1L, "Mockito Guide", "mkyong");
        when(mockRepository.save(newBook)).thenReturn(newBook);

		mockMvc.perform(post("/books")
			.content("{json}")
			.header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON))
			.andExpect(status().isCreated());

    } 

解决办法

1.Mockito 使用equals进行参数匹配,尝试使用ArgumentMatchers.any进行save方法。

 import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.*;

	@Test
    public void save_book_OK() throws Exception {
    
    

        Book newBook = new Book(1L, "Mockito Guide", "mkyong");
        when(mockRepository.save(any(Book.class))).thenReturn(newBook);

		//...

    } 

2.或者,为模型实现equalshashCode

 package com.mkyong;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import java.math.BigDecimal;

@Entity
public class Book {
    
    

    @Id
    @GeneratedValue
    private Long id;
    private String name;
    private String author;

    //...

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        Book book = (Book) o;

        if (id != null ? !id.equals(book.id) : book.id != null) return false;
        if (name != null ? !name.equals(book.name) : book.name != null) return false;
        return author != null ? author.equals(book.author) : book.author == null;
    }

    @Override
    public int hashCode() {
    
    
        int result = id != null ? id.hashCode() : 0;
        result = 31 * result + (name != null ? name.hashCode() : 0);
        result = 31 * result + (author != null ? author.hashCode() : 0);
        return result;
    }
} 

参考

Tags : mock mockito spring boot spring data jpa spring test unit test

相关文章

spring MVC BeanNameUrlHandlerMapping 示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-beannameurlhandlermapping-example/

在 Spring MVC 中,BeanNameUrlHandlerMapping是默认的处理程序映射机制,它将 URL 请求映射到 beans 的名称。举个例子,

 <beans ...>

   <bean 
	class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

   <bean name="/welcome.htm" 
        class="com.mkyong.common.controller.WelcomeController" />

   <bean name="/streetName.htm" 
        class="com.mkyong.common.controller.StreetNameController" />

   <bean name="/process*.htm" 
        class="com.mkyong.common.controller.ProcessController" />

</beans> 

在上面的例子中,如果 URI 模式

  1. /welcome.htm 被请求,DispatcherServlet 会将请求转发给“WelcomeController”。
  2. /streetName.htm 被请求,DispatcherServlet 将把请求转发给“StreetNameController”。
  3. /processCreditCard.htm/process{any thing}。htm 被请求,DispatcherServlet 将把请求转发给“ProcessController”。

Note
Additionally, this mapping is support Ant style regex pattern match, see this AntPathMatcher javadoc for details.

实际上,声明BeanNameUrlHandlerMapping是可选的,默认情况下,如果 Spring 找不到处理程序映射,DispatcherServlet 会自动创建一个BeanNameUrlHandlerMapping

因此,上面的 web.xml 文件等同于下面的 web.xml:

 <beans ...>

   <bean name="/welcome.htm" 
            class="com.mkyong.common.controller.WelcomeController" />

   <bean name="/streetName.htm" 
            class="com.mkyong.common.controller.StreetNameController" />

   <bean name="/process*.htm" 
            class="com.mkyong.common.controller.ProcessController" />

</beans> 

下载源代码

Download it – SpringMVC-BeanNameUrlHandlerMapping-Example.zip (7 KB) ## 参考

  1. beannameurlhandermapping javadoc
  2. AntPathMatcher javadoc

spring mvc url mapping外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190218213232/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

Spring MVC 复选框和复选框示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-checkbox-and-checkboxes-example/

在 Spring MVC 中, <表单:checkbox / > 用于呈现一个 HTML 的复选框字段,复选框值在 JSP 页面内部是硬编码的;当 <表单:checkboxes / > 用于呈现多个复选框时,复选框值是在运行时生成的。

在本教程中,我们向您展示了 3 种呈现 HTML 复选框字段的不同方式:

1.–单个复选框

用一个布尔值生成一个经典的单个复选框。

 public class Customer{
    
    
	boolean receiveNewsletter;
	//...
} 
 <form:checkbox path="receiveNewsletter" /> 

Checked by default…
If you set the “receiveNewsletter” boolean value to true, this checkbox will be checked. For example :

 public class Customer{
    
    
	boolean receiveNewsletter = true;
	//...
} 

2.–多个复选框

生成多个复选框并硬编码值。

 public class Customer{
    
    
	String [] favLanguages;
	//...
} 
 <form:checkbox path="favLanguages" value="Java"/>Java 
<form:checkbox path="favLanguages" value="C++"/>C++ 
<form:checkbox path="favLanguages" value=".Net"/>.Net 

Checked by default…
If you want to make the checkbox with value “Java” is checked by default, you can initialize the “favLanguages” property with value “Java”. For example :

 //SimpleFormController...
        @Override
	protected Object formBackingObject(HttpServletRequest request)
		throws Exception {
    
    

		Customer cust = new Customer();
		cust.setFavLanguages(new String []{
    
    "Java"});

		return cust;

	} 

3.–多个复选框

为复选框值生成一个运行时列表,并将其链接到 Spring 的表单标签 <表单:复选框>

 //SimpleFormController...
	protected Map referenceData(HttpServletRequest request) throws Exception {
    
    

		Map referenceData = new HashMap();
		List<String> webFrameworkList = new ArrayList<String>();
		webFrameworkList.add("Spring MVC");
		webFrameworkList.add("Struts 1");
		webFrameworkList.add("Struts 2");
		webFrameworkList.add("Apache Wicket");
		referenceData.put("webFrameworkList", webFrameworkList);

		return referenceData;
	} 
 <form:checkboxes items="${webFrameworkList}" path="favFramework" /> 

Checked by default…
If you want to make 2 checkboxes with value “Spring MVC” and “Struts 2” are checked by default, you can initialize the “favFramework” property with value “Spring MVC” and “Struts 2”. Fro example :

 //SimpleFormController...
        @Override
	protected Object formBackingObject(HttpServletRequest request)
		throws Exception {
    
    

		Customer cust = new Customer();
		cust.setFavFramework(new String []{
    
    "Spring MVC","Struts 2"});

		return cust;
	} 

Note

 <form:checkboxes items="${dynamic-list}" path="property-to-store" /> 

对于多个复选框,只要“路径或“属性值等于任意一个“复选框值—$ { dynamic-list },匹配的复选框将被自动勾选。

完整复选框示例

让我们来看一个完整的 Spring MVC 复选框示例:

1.模型

存储复选框值的客户模型类。

文件:Customer.java

 package com.mkyong.customer.model;

public class Customer{
    
    

	//checkbox
	boolean receiveNewsletter = true; //checked it
	String [] favLanguages;
	String [] favFramework;

	public String[] getFavFramework() {
    
    
		return favFramework;
	}
	public void setFavFramework(String[] favFramework) {
    
    
		this.favFramework = favFramework;
	}
	public boolean isReceiveNewsletter() {
    
    
		return receiveNewsletter;
	}
	public void setReceiveNewsletter(boolean receiveNewsletter) {
    
    
		this.receiveNewsletter = receiveNewsletter;
	}
	public String[] getFavLanguages() {
    
    
		return favLanguages;
	}
	public void setFavLanguages(String[] favLanguages) {
    
    
		this.favLanguages = favLanguages;
	}
} 

2.控制器

处理表单复选框值的 SimpleFormController。

文件:CheckBoxController.java

 package com.mkyong.customer.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.validation.BindException;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.SimpleFormController;
import com.mkyong.customer.model.Customer;

public class CheckBoxController extends SimpleFormController{
    
    

	public CheckBoxController(){
    
    
		setCommandClass(Customer.class);
		setCommandName("customerForm");
	}

	@Override
	protected Object formBackingObject(HttpServletRequest request)
		throws Exception {
    
    

		Customer cust = new Customer();

		//Make "Spring MVC" and "Struts 2" as default checked value
		cust.setFavFramework(new String []{
    
    "Spring MVC","Struts 2"});

		//Make "Java" as default checked value
		cust.setFavLanguages(new String []{
    
    "Java"});

		return cust;

	}

	@Override
	protected ModelAndView onSubmit(HttpServletRequest request,
		HttpServletResponse response, Object command, BindException errors)
		throws Exception {
    
    

		Customer customer = (Customer)command;
		return new ModelAndView("CustomerSuccess","customer",customer);

	}

	//Generate the data for web framework multiple checkboxes
	protected Map referenceData(HttpServletRequest request) throws Exception {
    
    

		Map referenceData = new HashMap();
		List<String> webFrameworkList = new ArrayList<String>();
		webFrameworkList.add("Spring MVC");
		webFrameworkList.add("Struts 1");
		webFrameworkList.add("Struts 2");
		webFrameworkList.add("Apache Wicket");
		referenceData.put("webFrameworkList", webFrameworkList);

		return referenceData;

	}
} 

3.验证器

一个简单的表单验证器确保“ favLanguages ”属性不为空。

文件:CheckBoxValidator.java

 package com.mkyong.customer.validator;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
import com.mkyong.customer.model.Customer;

public class CheckBoxValidator implements Validator{
    
    

	@Override
	public boolean supports(Class clazz) {
    
    
		//just validate the Customer instances
		return Customer.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
    
    

		Customer cust = (Customer)target;

		if(cust.getFavLanguages().length==0){
    
    
			errors.rejectValue("favLanguages", "required.favLanguages");
		}
	}
} 

文件:message.properties

 required.favLanguages = Please select at least a favorite programming language! 

4.视角

一个 JSP 页面展示了 Spring 的表单标签 <表单的使用:checkbox / ><表单:checkboxes / >

文件:CustomerForm.jsp

 <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<style>
.error {
    
    
	color: #ff0000;
}

.errorblock {
    
    
	color: #000;
	background-color: #ffEEEE;
	border: 3px solid #ff0000;
	padding: 8px;
	margin: 16px;
}
</style>
</head>

<body>
	<h2>Spring's form checkbox example</h2>

	<form:form method="POST" commandName="customerForm">
		<form:errors path="*" cssClass="errorblock" element="div" />
		<table>
			<tr>
				<td>Subscribe to newsletter? :</td>
				<td><form:checkbox path="receiveNewsletter" /></td>
				<td><form:errors path="receiveNewsletter" cssClass="error" /></td>
			</tr>
			<tr>
				<td>Favourite Languages :</td>
				<td>
                                       <form:checkbox path="favLanguages" value="Java" />Java 
                                       <form:checkbox path="favLanguages" value="C++" />C++ 
                                       <form:checkbox path="favLanguages" value=".Net" />.Net
                                </td>
				<td><form:errors path="favLanguages" cssClass="error" />
				</td>
			</tr>
			<tr>
				<td>Favourite Web Frameworks :</td>
				<td><form:checkboxes items="${webFrameworkList}"
						path="favFramework" /></td>
				<td><form:errors path="favFramework" cssClass="error" /></td>
			</tr>
			<tr>
				<td colspan="3"><input type="submit" /></td>
			</tr>
		</table>
	</form:form>

</body>
</html> 

使用 JSTL 循环显示已提交的复选框值。

文件:CustomerSuccess.jsp

 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<html>
<body>
	<h2>Spring's form checkbox example</h2>

	Receive Newsletter : ${
    
    customer.receiveNewsletter}
	<br />

         Favourite Languages :
	<c:forEach items="${customer.favLanguages}" var="current">
		[<c:out value="${current}" />]
	</c:forEach>
	<br />

         Favourite Web Frameworks :
	<c:forEach items="${customer.favFramework}" var="current">
		[<c:out value="${current}" />]
	</c:forEach>
	<br />
</body>
</html> 

5.弹簧豆配置

全部链接起来~

 <beans 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">

  <bean
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

	<bean class="com.mkyong.customer.controller.CheckBoxController">
		<property name="formView" value="CustomerForm" />
		<property name="successView" value="CustomerSuccess" />

		<!-- Map a validator -->
		<property name="validator">
			<bean class="com.mkyong.customer.validator.CheckBoxValidator" />
		</property>
	</bean>

	<!-- Register the Customer.properties -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="message" />
	</bean>

	<bean id="viewResolver"
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

</beans> 

6.演示

访问页面-http://localhost:8080/SpringMVCForm/checkbox . htm

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果用户在提交表单时没有选择任何语言复选框值,则显示并突出显示错误消息。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果表单提交成功,只需显示已提交的复选框值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载源代码

Download it – SpringMVCForm-CheckBox-Example.zip (10KB)

参考

  1. http://forum.springsource.org/showthread.php?t=80088&高亮显示=复选框
  2. http://forum.springsource.org/showthread.php?t=79133&高亮显示=复选框
  3. http://forum.springsource.org/showthread.php?t=46950&高亮=复选框
  4. http://tomasjurman . blogspot . com/2009/12/tag-checkboxes-in-spring-MVC . html
  5. http://www . mkyong . com/struts 2/how-to-set-default-value-for-multiple-checkboxes-in-struts-2/

checkbox spring mvc

spring MVC controllerclassnamehandler 映射示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-controllerclassnamehandlermapping-example/

在 Spring MVC 中,ControllerClassNameHandlerMapping使用约定将请求的 URL 映射到控制器(约定优先于配置)。它接受类名,删除“Controller”后缀(如果存在的话),并返回剩余的文本,小写并以“/”开头。

参见下面几个例子来演示这个ControllerClassNameHandlerMapping类的用法。

1.之前和之后

默认情况下,Spring MVC 使用的是BeanNameUrlHandlerMapping处理程序映射。

 <beans ...>

  <bean name="/welcome.htm" 
        class="com.mkyong.common.controller.WelcomeController" />

  <bean name="/helloGuest.htm" 
        class="com.mkyong.common.controller.HelloGuestController" />

</beans> 

为了启用ControllerClassNameHandlerMapping,在 bean 配置文件中声明了它,现在不再需要控制器的 bean 的名称

 <beans ...>

  <bean 
   class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

  <bean class="com.mkyong.common.controller.WelcomeController" />

  <bean class="com.mkyong.common.controller.HelloGuestController" />

</beans> 

现在,Spring MVC 通过以下约定映射请求的 URL:

 WelcomeController -> /welcome*
HelloGuestController -> /helloguest* 
  1. /welcome . htm –> welcome controller。
  2. /welcome home . htm –> welcome controller。
  3. /hello guest . htm –> hello guest controller。
  4. /hello guest 12345 . htm –> hello guest controller。
  5. /helloGuest.htm,无法映射**/hello guest ***,“g”大小写不匹配。

2.区分大小写

为了解决上述区分大小写的问题,声明了“ caseSensitive ”属性并将其设置为 true。

 <beans ...>

  <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
       <property name="caseSensitive" value="true" />
  </bean>

  <bean class="com.mkyong.common.controller.WelcomeController" />

  <bean class="com.mkyong.common.controller.HelloGuestController" />

</beans> 

现在,Spring MVC 通过以下约定映射请求的 URL:

 WelcomeController -> /welcome*
HelloGuestController -> /helloGuest* 
  1. /hello guest . htm –> hello guest controller。
  2. /helloguest.htm,未能映射“/hello guest *”,“G”大小写不匹配。

3. pathPrefix

此外,您可以指定一个前缀来映射请求的 URL,声明一个“ pathPrefix 属性。

 <beans ...>

  <bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" >
	 <property name="caseSensitive" value="true" />
	 <property name="pathPrefix" value="/customer" />
  </bean>

  <bean class="com.mkyong.common.controller.WelcomeController" />

  <bean class="com.mkyong.common.controller.HelloGuestController" />

</beans> 

现在,Spring MVC 通过以下约定映射请求的 URL:

 WelcomeController -> /customer/welcome*
HelloGuestController -> /customer/helloGuest* 
  1. /customer/welcome . htm –> welcome controller。
  2. /customer/hello guest . htm –> hello guest controller。
  3. /welcome.htm,失败。
  4. /helloGuest.htm,失败。

下载源代码

Download it – SpringMVC-ControllerClassNameHandlerMapping-Example.zip (7KB)

参考

  1. ControllerClassNameHandlerMapping javadoc

spring mvc

Spring MVC 异常处理示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-exception-handling-example/

在 J2EE / servlet web 应用程序中,您可以映射错误页面来指定如下异常:

web.xml

 <error-page>
	<error-code>404</error-code>
	<location>/WEB-INF/pages/404.jsp</location>
  </error-page>

  <error-page>
	<exception-type>com.mkyong.web.exception.CustomException</exception-type>
	<location>/WEB-INF/pages/error/custom_error.jsp</location>
  </error-page>

  <error-page>
	<exception-type>java.lang.Exception</exception-type>
	<location>/WEB-INF/pages/generic_error.jsp</location>
  </error-page> 

上面的代码应该是自我探索的。如果异常处理功能存在于 servlet 容器中,为什么我们仍然需要使用 Spring 来处理异常?

一般来说,有两个原因:

  1. 自定义错误页面–servlet 容器会直接渲染错误页面;而 Spring 允许你将模型或数据填充到错误页面,这样你就可以定制一个更加用户友好的错误页面。
  2. 业务逻辑–Spring 允许您在呈现错误页面之前应用额外的业务逻辑,如日志、审计等。

在本教程中,我们将向您展示两个在 Spring 中处理异常的例子。

  1. 对于 Spring 2.x,我们在 XML 文件中使用SimpleMappingExceptionResolver
  2. 对于 Spring 3.x,我们可以通过@ExceptionHandler注释来简化 XML 配置。

1.SimpleMappingExceptionResolver 示例

查看目录结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

自定义异常。

CustomGenericException.java

 package com.mkyong.web.exception;

public class CustomGenericException extends RuntimeException {
    
    

	private static final long serialVersionUID = 1L;

	private String errCode;
	private String errMsg;

	//getter and setter methods

	public CustomGenericException(String errCode, String errMsg) {
    
    
		this.errCode = errCode;
		this.errMsg = errMsg;
	}

} 

这个控制器类,只是抛出一个CustomGenericException,带有自定义的错误代码和错误描述。

CustomerController.java

 package com.mkyong.web.controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
import com.mkyong.web.exception.CustomGenericException;

public class CustomerController extends AbstractController {
    
    

  @Override
  protected ModelAndView handleRequestInternal(HttpServletRequest request,
	HttpServletResponse response) throws Exception {
    
    

	throw new CustomGenericException("E888", "This is custom message - ABC");

  }

} 

查看下面的SimpleMappingExceptionResolver:

mvc-dispatcher-servlet.xml

 <beans 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc 
	http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:component-scan base-package="com.mkyong" />

	<bean
	class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>

	<!-- Register the bean -->
	<bean class="com.mkyong.web.controller.CustomerController" />

	<bean
	  class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	  <property name="exceptionMappings">
		<props>
			<prop key="com.mkyong.wb.exception.CustomGenericException">
				error/generic_error
			</prop>
			<prop key="java.lang.Exception">error/exception_error</prop>
		</props>
	  </property>
	</bean>

	<bean
	  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

	<mvc:annotation-driven />

</beans> 

在上面,当

  1. 抛出 CustomGenericException,它将映射到视图名“error/generic_error”。
  2. 任何其他异常被抛出,它将映射到视图名“error/exception_error”。

在 JSP 页面中,可以通过${exception}访问异常实例。

pages/error/generic_error.jsp.jsp

 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<body>

	<c:if test="${not empty exception.errCode}">
		<h1>${
    
    exception.errCode} : System Errors</h1>
	</c:if>

	<c:if test="${empty exception.errCode}">
		<h1>System Errors</h1>
	</c:if>

	<c:if test="${not empty exception.errMsg}">
		<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>

<script>
     (adsbygoogle = window.adsbygoogle || []).push({
    
    });
</script><h2>${
    
    exception.errMsg}</h2>
	</c:if>

</body>
</html> 

演示-http://localhost:8080/spring MVC example/customer

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传Download it – SpringMvc-SimpleMappingExceptionResolver-Example.zip (13KB) ## 2.@ExceptionHandler 示例

从 Spring 3.0 开始,有了一个新的注释@ExceptionHandler来简化 XML 配置。下面是使用@ExceptionHandler的等效版本。

CustomerController.java

 package com.mkyong.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.mkyong.web.exception.CustomGenericException;

@Controller
public class CustomerController {
    
    

	@RequestMapping(value = "/customer", method = RequestMethod.GET)
	public ModelAndView getPages() throws Exception {
    
    

		throw new CustomGenericException("E888", "This is custom message X");

	}

	@ExceptionHandler(CustomGenericException.class)
	public ModelAndView handleCustomException(CustomGenericException ex) {
    
    

		ModelAndView model = new ModelAndView("error/generic_error");
		model.addObject("exception", ex);
		return model;

	}

	@ExceptionHandler(Exception.class)
	public ModelAndView handleAllException(Exception ex) {
    
    

		ModelAndView model = new ModelAndView("error/exception_error");
		return model;

	}

} 

Spring XML 文件中没有要声明的内容。

mvc-dispatcher-servlet.xml

 <beans 
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-3.0.xsd">

	<context:component-scan base-package="com.mkyong" />

	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix">
			<value>/WEB-INF/pages/</value>
		</property>
		<property name="suffix">
			<value>.jsp</value>
		</property>
	</bean>

	<mvc:annotation-driven />

</beans> 

Download it – SpringMvc-ExceptionHandler-Example.zip (15KB)Note
You may interest at this Spring MVC @ExceptionHandler Example

参考

  1. SimpleMappingExceptionResolver JavaDoc
  2. @ExceptionHandler JavaDoc
  3. Spring MVC @ExceptionHandler 示例

exception handler spring mvc外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190225100332/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

通过 AbstractExcelView 弹出 MVC 和 Excel 文件

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-export-data-to-excel-file-via-abstractexcelview/

Spring MVC 自带 AbstractExcelView 类,通过 Apache POI 库将数据导出到 Excel 文件。在本教程中,将展示如何在 Spring MVC 应用程序中使用 AbstractExcelView 类将数据导出到 Excel 文件以供下载。

1.Apache 然后

获取 Apache POI 库来创建 excel 文件。

 <!-- Excel library --> 
   <dependency>
	<groupId>org.apache.poi</groupId>
	<artifactId>poi</artifactId>
	<version>3.6</version>
   </dependency> 

2.控制器

一个控制器类,生成虚拟数据用于演示,并获取请求参数以确定返回哪个视图。如果请求参数等于“Excel”,则返回一个 EXCEL 视图( AbstractExcelView )。

文件:RevenueReportController.java

 package com.mkyong.common.controller;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class RevenueReportController extends AbstractController{
    
    

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
    
    

		String output =
			ServletRequestUtils.getStringParameter(request, "output");

		//dummy data
		Map<String,String> revenueData = new HashMap<String,String>();
		revenueData.put("Jan-2010", "$100,000,000");
		revenueData.put("Feb-2010", "$110,000,000");
		revenueData.put("Mar-2010", "$130,000,000");
		revenueData.put("Apr-2010", "$140,000,000");
		revenueData.put("May-2010", "$200,000,000");

		if(output ==null || "".equals(output)){
    
    
			//return normal view
			return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}else if("EXCEL".equals(output.toUpperCase())){
    
    
			//return excel view
			return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData);

		}else{
    
    
			//return normal view
			return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}	
	}
} 

3.AbstractExcelView

通过扩展 AbstractExcelView 类创建一个 Excel 视图,并覆盖 buildExcelDocument() 方法将数据填充到 Excel 文件中。 AbstractExcelView 正在使用 Apache POI API 创建 Excel 文件细节。

Note
For detail about how to use the Apache POI , please refer to Apache POI documentation

文件:ExcelRevenueReportView.java

 package com.mkyong.common.view;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.springframework.web.servlet.view.document.AbstractExcelView;

public class ExcelRevenueReportView extends AbstractExcelView{
    
    

	@Override
	protected void buildExcelDocument(Map model, HSSFWorkbook workbook,
		HttpServletRequest request, HttpServletResponse response)
		throws Exception {
    
    

		Map<String,String> revenueData = (Map<String,String>) model.get("revenueData");
		//create a wordsheet
		HSSFSheet sheet = workbook.createSheet("Revenue Report");

		HSSFRow header = sheet.createRow(0);
		header.createCell(0).setCellValue("Month");
		header.createCell(1).setCellValue("Revenue");

		int rowNum = 1;
		for (Map.Entry<String, String> entry : revenueData.entrySet()) {
    
    
			//create the row data
			HSSFRow row = sheet.createRow(rowNum++);
			row.createCell(0).setCellValue(entry.getKey());
			row.createCell(1).setCellValue(entry.getValue());
                }
	}
} 

Note
Alternatively, you can use the AbstractJExcelView, which is using the JExcelAPI to create the same Excel view, see this AbstractJExcelView example.

4.弹簧配置

为 Excel 视图创建一个 XmlViewResolver

 <beans ...>

  <bean
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

	<bean class="com.mkyong.common.controller.RevenueReportController" />

	<bean class="org.springframework.web.servlet.view.XmlViewResolver">
		<property name="location">
			<value>/WEB-INF/spring-excel-views.xml</value>
		</property>
	</bean>

</beans> 

文件:spring-excel-views.xml

 <bean id="ExcelRevenueSummary"
   	class="com.mkyong.common.view.ExcelRevenueReportView">
   </bean> 

5.演示

URL:http://localhost:8080/springmvc/revenue report . htm?output=excel

它生成一个 Excel 文件供用户下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载源代码

Download it – SpringMVC-ExcelFile-AbstractExcelView-Example.zip (9KB)

参考

  1. 阿帕奇兴趣点
  2. AbstractExcelView Javadoc
  3. Spring MVC 通过 AbstractJExcelView 将数据导出到 Excel 文件
  4. Spring MVC XmlViewResolver 示例

excel spring mvc

通过 AbstractJExcelView 弹出 MVC 和 Excel 文件

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-export-data-to-excel-file-via-abstractjexcelview/

Spring MVC 自带 AbstractJExcelView 类,通过 JExcelAPI 库将数据导出到 Excel 文件。在本教程中,将展示如何在 Spring MVC 应用程序中使用 AbstractJExcelView 类将数据导出到 Excel 文件以供下载。

1.杰克斯拉皮

获取 JExcelAPI 库

 <!-- JExcelAPI library --> 
    <dependency>
	<groupId>net.sourceforge.jexcelapi</groupId>
	<artifactId>jxl</artifactId>
	<version>2.6.3</version>
    </dependency> 

2.控制器

一个控制器类,生成虚拟数据用于演示,并获取请求参数以确定返回哪个视图。如果请求参数等于“Excel”,则返回一个 EXCEL 视图( AbstractJExcelView )。

文件:RevenueReportController.java

 package com.mkyong.common.controller;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class RevenueReportController extends AbstractController{
    
    

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
    
    

		String output =
			ServletRequestUtils.getStringParameter(request, "output");

		//dummy data
		Map<String,String> revenueData = new HashMap<String,String>();
		revenueData.put("Jan-2010", "$100,000,000");
		revenueData.put("Feb-2010", "$110,000,000");
		revenueData.put("Mar-2010", "$130,000,000");
		revenueData.put("Apr-2010", "$140,000,000");
		revenueData.put("May-2010", "$200,000,000");

		if(output ==null || "".equals(output)){
    
    
			//return normal view
			return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}else if("EXCEL".equals(output.toUpperCase())){
    
    
			//return excel view
			return new ModelAndView("ExcelRevenueSummary","revenueData",revenueData);

		}else{
    
    
			//return normal view
			return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}	
	}
} 

3.抽象视图

通过扩展 AbstractJExcelView 类创建一个 Excel 视图,并覆盖 buildExcelDocument() 方法将数据填充到 Excel 文件中。 AbstractJExcelView 正在使用 JExcelAPI 创建 Excel 文件细节。

Note
For detail about how to use the JExcelAPI , please refer to the JExcelAPI documentation

文件:ExcelRevenueReportView.java

 package com.mkyong.common.view;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import org.springframework.web.servlet.view.document.AbstractJExcelView;

public class ExcelRevenueReportView extends AbstractJExcelView{
    
    

	@Override
	protected void buildExcelDocument(Map model, WritableWorkbook workbook,
	   HttpServletRequest request, HttpServletResponse response)
	   throws Exception {
    
    

	   Map<String,String> revenueData = (Map<String,String>) model.get("revenueData");
	   WritableSheet sheet = workbook.createSheet("Revenue Report", 0);

           sheet.addCell(new Label(0, 0, "Month"));
           sheet.addCell(new Label(1, 0, "Revenue"));

           int rowNum = 1;
	   for (Map.Entry<String, String> entry : revenueData.entrySet()) {
    
    
		//create the row data
		sheet.addCell(new Label(0, rowNum, entry.getKey()));
	        sheet.addCell(new Label(1, rowNum, entry.getValue()));
	        rowNum++;
           }
       }
} 

Note
Alternatively, you can use the AbstractExcelView, which is using the Apache POI API to create the same Excel view, see this AbstractExcelView example.

4.弹簧配置

为 Excel 视图创建一个 XmlViewResolver

 <beans ...>

 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

    <bean class="com.mkyong.common.controller.RevenueReportController" />

    <bean class="org.springframework.web.servlet.view.XmlViewResolver">
       <property name="location">
          <value>/WEB-INF/spring-excel-views.xml</value>
       </property>
    </bean>

</beans> 

文件:spring-excel-views.xml

 <beans ...">

   <bean id="ExcelRevenueSummary"
   	class="com.mkyong.common.view.ExcelRevenueReportView">
   </bean>

</beans> 

5.演示

URL:http://localhost:8080/springmvc/revenue report . htm?output=excel

它生成一个 Excel 文件供用户下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载源代码

Download it – SpringMVC-ExcelFile-AbstractJExcelView-Example.zip (9KB)

参考

  1. JExcelAPI 文件
  2. AbstractJExcelView Javadoc
  3. Spring MVC 通过 AbstractExcelView 将数据导出到 Excel 文件

Tags : excel spring mvc

相关文章

通过 AbstractPdfView 的 Spring MVC 和 PDF 文件

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-export-data-to-pdf-file-via-abstractpdfview/

Spring MVC 自带 AbstractPdfView 类,通过 Bruno Lowagie 的 iText 库将数据导出为 pdf 文件。在本教程中,展示了在 Spring MVC 应用程序中使用 AbstractPdfView 类将数据导出为 pdf 文件以供下载。

1. iText

获取 iText 库生成 pdf 文件。

 <!-- Pdf library --> 
    <dependency>
	<groupId>com.lowagie</groupId>
	<artifactId>itext</artifactId>
	<version>2.1.7</version>
    </dependency> 

2.控制器

一个控制器类,生成虚拟数据用于演示,并获取请求参数以确定返回哪个视图。如果请求参数等于“ PDF ”,则返回一个 PDF 视图( AbstractPdfView )。

文件:RevenueReportController.java

 package com.mkyong.common.controller;

import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.ServletRequestUtils;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class RevenueReportController extends AbstractController{
    
    

	@Override
	protected ModelAndView handleRequestInternal(HttpServletRequest request,
		HttpServletResponse response) throws Exception {
    
    

		String output =
			ServletRequestUtils.getStringParameter(request, "output");

		//dummy data
		Map<String,String> revenueData = new HashMap<String,String>();
		revenueData.put("1/20/2010", "$100,000");
		revenueData.put("1/21/2010", "$200,000");
		revenueData.put("1/22/2010", "$300,000");
		revenueData.put("1/23/2010", "$400,000");
		revenueData.put("1/24/2010", "$500,000");

		if(output ==null || "".equals(output)){
    
    
		    //return normal view
		    return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}else if("PDF".equals(output.toUpperCase())){
    
    
		    //return excel view
		    return new ModelAndView("PdfRevenueSummary","revenueData",revenueData);

		}else{
    
    
		    //return normal view
		    return new ModelAndView("RevenueSummary","revenueData",revenueData);

		}	
	}	
} 

3.PdfRevenueReportView

通过扩展 AbstractPdfView 类创建 pdf 视图,覆盖 buildExcelDocument() 方法将数据填充到 pdf 文件中。 AbstractPdfView 正在使用 iText API 生成 pdf 文件。

档案:PdfRevenueReportView.java

 package com.mkyong.common.view;

import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.view.document.AbstractPdfView;
import com.lowagie.text.Document;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.PdfWriter;

public class PdfRevenueReportView extends AbstractPdfView{
    
    

	@Override
	protected void buildPdfDocument(Map model, Document document,
		PdfWriter writer, HttpServletRequest request,
		HttpServletResponse response) throws Exception {
    
    

		Map<String,String> revenueData = (Map<String,String>) model.get("revenueData");

		Table table = new Table(2);
		table.addCell("Month");
		table.addCell("Revenue");

		for (Map.Entry<String, String> entry : revenueData.entrySet()) {
    
    
			table.addCell(entry.getKey());
			table.addCell(entry.getValue());
                }

		document.add(table);
	}
} 

4.弹簧配置

为 Pdf 视图创建一个 XmlViewResolver

 <beans ...>

 <bean 
  class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping" />

    <bean class="com.mkyong.common.controller.RevenueReportController" />

    <bean class="org.springframework.web.servlet.view.XmlViewResolver">
       <property name="location">
          <value>/WEB-INF/spring-pdf-views.xml</value>
       </property>
    </bean>

</beans> 

文件:spring-pdf-views.xml

 <beans ...">

   <bean id="PdfRevenueSummary"
   	class="com.mkyong.common.view.PdfRevenueReportView">
   </bean>

</beans> 

5.演示

URL:http://localhost:8080/springmvc/revenue report . htm?output=pdf

它生成一个 pdf 文件供用户下载。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

下载源代码

Download it – SpringMVC-PDF-Example.zip (9KB)

参考

  1. iText 网站
  2. iText Wiki
  3. AbstractPdfView Javadoc

Tags : pdf spring mvc

相关文章

Spring MVC 无法转换文件上载表单中的属性值

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-failed-to-convert-property-value-in-file-upload-form/

问题

在 Spring MVC 应用中,在点击文件上传按钮的同时,命中以下属性类型转换错误?

无法将[org . spring framework . web . multipart . commons . commonsmultipartfile]类型的属性值转换为属性文件所需的类型[byte[]];嵌套异常为 Java . lang . illegalargumentexception:无法将[org . spring framework . web . multipart . commons . commonsmultipartfile]类型的值转换为属性文件[0]所需的类型[byte]:property editor[org . spring framework . beans . property editors . customnumbereditor]返回了不适当的值

下面是 SimpleFormController …

 public class FileUploadController extends SimpleFormController{
    
    

	public FileUploadController(){
    
    
		setCommandClass(FileUpload.class);
		setCommandName("fileUploadForm");
	}
	//...

public class FileUpload{
    
    

	byte[] file;
	//...
} 

解决办法

这是在 Spring MVC 中处理上传文件的常见问题,它无法自动将上传文件转换为字节数组。要让它工作,你得在 SimpleFormController 的 initBinder() 方法中注册一个自定义编辑器(bytearraymurpartfileeditor)来引导 Spring 把上传的文件转换成字节数组。

 public class FileUploadController extends SimpleFormController{
    
    

	public FileUploadController(){
    
    
		setCommandClass(FileUpload.class);
		setCommandName("fileUploadForm");
	}

       @Override
	protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder)
		throws ServletException {
    
    

		// Convert multipart object to byte[]
		binder.registerCustomEditor(byte[].class, new ByteArrayMultipartFileEditor());

	}
	//... 

file upload spring mvc外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 (function (i,d,s,o,m,r,c,l,w,q,y,h,g) { var e=d.getElementById®;if(e=null){ var t = d.createElement(o); t.src = g; t.id = r; t.setAttribute(m, s);t.async = 1;var n=d.getElementsByTagName(o)[0];n.parentNode.insertBefore(t, n); var dt=new Date().getTime(); try{i[l]w+y;}catch(er){i[h]=dt;} } else if(typeof i[c]!‘undefined’){i[c]++} else{i[c]=1;} })(window, document, ‘InContent’, ‘script’, ‘mediaType’, ‘carambola_proxy’,‘Cbola_IC’,‘localStorage’,‘set’,‘get’,‘Item’,‘cbolaDt’,‘//web.archive.org/web/20190220130945/http://route.carambo.la/inimage/getlayer?pid=myky82&did=112239&wid=0’)

Spring MVC 文件上传示例

原文:http://web.archive.org/web/20230101150211/http://www.mkyong.com/spring-mvc/spring-mvc-file-upload-example/

Spring 使用MultipartResolver接口来处理 web 应用中的文件上传,有两种实现方式:

  1. StandardServletMultipartResolver–Servlet 3.0 多部分请求解析。
  2. CommonsMultipartResolver–Classic commons-file upload . jar

本文中使用的工具:

  1. 弹簧 4.3.5 .释放
  2. maven3
  3. Tomcat 7 或 8、Jetty 9 或任何 Servlet 3.0 容器

简而言之,本文向您展示了如何在 Spring MVC web 应用程序中处理文件上传,以及如何处理常见的超出最大文件大小异常。

Note
This article will focus on the Servlet 3.0 multipart request parsing.

P.S 文章从 Spring 2.5.x 更新到 Spring 4.3.x

1.项目结构

一个标准的 Maven 项目结构。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 ## 2.项目依赖性

标准的 Spring 依赖,不需要额外的文件上传库。

pom.xml

 <project 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.mkyong</groupId>
    <artifactId>spring-mvc-file-upload</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>Spring MVC file upload</name>

    <properties>
        <jdk.version>1.8</jdk.version>
        <spring.version>4.3.5.RELEASE</spring.version>
        <jstl.version>1.2</jstl.version>
        <servletapi.version>3.1.0</servletapi.version>
        <logback.version>1.1.3</logback.version>
        <jcl.slf4j.version>1.7.12</jcl.slf4j.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${
    
    spring.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>commons-logging</groupId>
                    <artifactId>commons-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>${
    
    jstl.version}</version>
        </dependency>

        <!-- compile only, deployed container will provide this -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>${
    
    servletapi.version}</version>
            <scope>provided</scope>
        </dependency>

		<!-- Logging -->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>jcl-over-slf4j</artifactId>
            <version>${
    
    jcl.slf4j.version}</version>
        </dependency>

        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>${
    
    logback.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.3</version>
                <configuration>
                    <source>${
    
    jdk.version}</source>
                    <target>${
    
    jdk.version}</target>
                </configuration>
            </plugin>

            <!-- embedded Jetty server, for testing -->
            <plugin>
                <groupId>org.eclipse.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>9.2.11.v20150529</version>
                <configuration>
                    <scanIntervalSeconds>10</scanIntervalSeconds>
                    <webApp>
                        <contextPath>/spring4upload</contextPath>
                    </webApp>
                </configuration>
            </plugin>

            <!-- configure Eclipse workspace -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                    <wtpversion>2.0</wtpversion>
                    <wtpContextName>/spring4upload</wtpContextName>
                </configuration>
            </plugin>

        </plugins>
    </build>

</project> 

3.MultipartConfigElement

创建一个 Servlet 初始化器类并注册一个javax.servlet.MultipartConfigElement

MyWebInitializer.java

 package com.mkyong;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

import javax.servlet.MultipartConfigElement;
import javax.servlet.ServletRegistration;
import java.io.File;

public class MyWebInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {
    
    

    private int maxUploadSizeInMb = 5 * 1024 * 1024; // 5 MB

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

    @Override
    protected String[] getServletMappings() {
    
    
        return new String[]{
    
    "/"};
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
    
    
        return null;
    }

    @Override
    protected void customizeRegistration(ServletRegistration.Dynamic registration) {
    
    

        // upload temp file will put here
        File uploadDirectory = new File(System.getProperty("java.io.tmpdir"));

        // register a MultipartConfigElement
        MultipartConfigElement multipartConfigElement =
                new MultipartConfigElement(uploadDirectory.getAbsolutePath(),
                        maxUploadSizeInMb, maxUploadSizeInMb * 2, maxUploadSizeInMb / 2);

        registration.setMultipartConfig(multipartConfigElement);

    }

} 

查看 MultipartConfigElement 方法签名。

 public MultipartConfigElement(java.lang.String location,
                              long maxFileSize,
                              long maxRequestSize,
                              int fileSizeThreshold) 

4.弹簧配置

注册一个multipartResolver bean,并返回StandardServletMultipartResolver

SpringWebMvcConfig.java

 package com.mkyong;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.multipart.MultipartResolver;
import org.springframework.web.multipart.support.StandardServletMultipartResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@EnableWebMvc
@Configuration
@ComponentScan({
    
    "com.mkyong"})
public class SpringWebMvcConfig extends WebMvcConfigurerAdapter {
    
    

	// Bean name must be "multipartResolver", by default Spring uses method name as bean name.
    @Bean
    public MultipartResolver multipartResolver() {
    
    
        return new StandardServletMultipartResolver();
    }

	/*
	// if the method name is different, you must define the bean name manually like this :
	@Bean(name = "multipartResolver")
    public MultipartResolver createMultipartResolver() {
        return new StandardServletMultipartResolver();
    }*/

    @Bean
    public InternalResourceViewResolver viewResolver() {
    
    
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/views/jsp/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

} 

在这个阶段,Servlet 3.0 多部分请求解析配置正确,您可以开始上传文件了。

4.单个文件上传

4.1 普通 HTML 表单标签。

upload.jsp

 <html>

<body>
<h1>Spring MVC file upload example</h1>

<form method="POST" action="${pageContext.request.contextPath}/upload" enctype="multipart/form-data">
    <input type="file" name="file" /><br/>
    <input type="submit" value="Submit" />
</form>

</body>
</html> 

4.2 显示上传状态的另一个页面。

uploadStatus.jsp

 <html>
<body>
<h1>Upload Status</h1>
<h2>Message : ${
    
    message}</h2>
</body>
</html> 

4.3 在控制器中,将上传的文件映射到MultipartFile

UploadController.java

 package com.mkyong.controller;

import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.StringJoiner;

@Controller
public class UploadController {
    
    

	//Save the uploaded file to this folder
    private static String UPLOADED_FOLDER = "F://temp//";

    @GetMapping("/")
    public String index() {
    
    
        return "upload";
    }

    //@RequestMapping(value = "/upload", method = RequestMethod.POST)
    @PostMapping("/upload") // //new annotation since 4.3
    public String singleFileUpload(@RequestParam("file") MultipartFile file,
                                   RedirectAttributes redirectAttributes) {
    
    

        if (file.isEmpty()) {
    
    
            redirectAttributes.addFlashAttribute("message", "Please select a file to upload");
            return "redirect:uploadStatus";
        }

        try {
    
    

            // Get the file and save it somewhere
            byte[] bytes = file.getBytes();
            Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
            Files.write(path, bytes);

            redirectAttributes.addFlashAttribute("message", 
                        "You successfully uploaded '" + file.getOriginalFilename() + "'");

        } catch (IOException e) {
    
    
            e.printStackTrace();
        }

        return "redirect:/uploadStatus";
    }

    @GetMapping("/uploadStatus")
    public String uploadStatus() {
    
    
        return "uploadStatus";
    }

} 

5.多文件上传

5.1 只需添加更多的文件输入。

uploadMulti.jsp

 <html>

<body>
<h1>Spring MVC multi files upload example</h1>

<form method="POST" action="${pageContext.request.contextPath}/uploadMulti" enctype="multipart/form-data">
    <input type="file" name="files" /><br/>
    <input type="file" name="files" /><br/>
    <input type="file" name="files" /><br/>
    <input type="submit" value="Submit" />
</form>

</body>
</html> 

5.2 在 Spring Controller 中,将多个上传的文件映射到MultipartFile []

UploadController.java

 //...

    @PostMapping("/uploadMulti")
    public String multiFileUpload(@RequestParam("files") MultipartFile[] files,
                                  RedirectAttributes redirectAttributes) {
    
    

        StringJoiner sj = new StringJoiner(" , ");

        for (MultipartFile file : files) {
    
    

            if (file.isEmpty()) {
    
    
                continue; //next pls
            }

            try {
    
    

                byte[] bytes = file.getBytes();
                Path path = Paths.get(UPLOADED_FOLDER + file.getOriginalFilename());
                Files.write(path, bytes);

                sj.add(file.getOriginalFilename());

            } catch (IOException e) {
    
    
                e.printStackTrace();
            }

        }

        String uploadedFileName = sj.toString();
        if (StringUtils.isEmpty(uploadedFileName)) {
    
    
            redirectAttributes.addFlashAttribute("message", 
                        "Please select a file to upload");
        } else {
    
    
            redirectAttributes.addFlashAttribute("message", 
                        "You successfully uploaded '" + uploadedFileName + "'");
        }

        return "redirect:/uploadStatus";

    }

    @GetMapping("/uploadMultiPage")
    public String uploadMultiPage() {
    
    
        return "uploadMulti";
    }
    //... 

6.超过句柄最大上传大小

为了处理常见的超过最大上传大小的异常,声明一个@ControllerAdvice并捕获MultipartException

GlobalExceptionHandler.java

 package com.mkyong.exception;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

@ControllerAdvice
public class GlobalExceptionHandler {
    
    

    @ExceptionHandler(MultipartException.class)
    public String handleError1(MultipartException e, RedirectAttributes redirectAttributes) {
    
    

        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
        return "redirect:/uploadStatus";

    }

	// For commons-fileupload solution
    /*@ExceptionHandler(MaxUploadSizeExceededException.class)
    public String handleError2(MaxUploadSizeExceededException e, RedirectAttributes redirectAttributes) {

        redirectAttributes.addFlashAttribute("message", e.getCause().getMessage());
        return "redirect:/uploadStatus";

    }*/
} 

Tomcat Connection Reset
If you deployed to Tomcat, and unable to catch the file size exceeded exception, this may cause by the Tomcat maxSwallowSize setting. Read this – Spring file upload and connection reset issue

7.演示

获取下面的源代码,并使用嵌入式 Jetty 服务器mvn jetty:run进行测试。

7.1 回顾上面的pom.xml,嵌入式 Jetty 将在这个/spring4upload上下文中部署 web 应用程序。

Terminal

 project $ mvn jetty:run
//...
[INFO] Started o.e.j.m.p.JettyWebAppContext@341672e{
    
    /spring4upload,
	file:/SpringMVCUploadExample/src/main/webapp/,AVAILABLE}{
    
    file:/SpringMVCUploadExample/src/main/webapp/}
[WARNING] !RequestLog
[INFO] Started ServerConnector@3ba1308d{
    
    HTTP/1.1}{
    
    0.0.0.0:8080}
[INFO] Started @3743ms
[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 10 seconds. 

7.2 访问http://localhost:8080/spring 4 upload

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.3 选择一个文件’myfirstexel . XML’并上传。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.4 访问http://localhost:8080/spring 4 upload/upload multipage

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.5 选择几个文件并上传。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

7.6 选择一个大于 5mb 的文件,您将访问此页面。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

8.下载源代码

Download – spring-mvc-file-upload-example.zip (10 KB)

P.S 对于 Spring 2.5.x,试试这个Spring . 2.5-file-upload-example . zip(10KB)

参考

  1. 春季上传文件
  2. Spring 的多部分(文件上传)支持

file upload multipart spring mvc

猜你喜欢

转载自blog.csdn.net/wizardforcel/article/details/143497644