struts中使用FormFile文件上传

用贯了spring mvc的注入式文件上传,回到struts中都忘了怎么写,翻了翻老项目,记录下。
struts config中,定义formBean,action中用name指定formBean。

<struts-config>
    <form-beans>
        <form-bean name="fileManagerForm" type="com.dorole.FileManagerForm" />
    </form-beans>
    <action path="..." type="..." parameter="method" name="fileManagerForm">
        <forward name="..." path="..."></forward>
    </action>
</struts-config>

FileManagerForm如下

public class FileManagerForm extends ActionForm {
    private FormFile file;
    public void setFile(FormFile file) {
        this.file = file;
    }
    public FormFile getFile() {
        return file;
    }
}

FileManagerAction如下

public ActionForward upload(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        FileManagerForm fmf = (FileManagerForm) form;
        FormFile formFile = fmf.getFile();
        if (formFile.getFileData().length != 0) {
            ...
        }
        return null;
}

jsp如下

<form action="..." method="post" enctype="multipart/form-data">
    <input type="file" name="file" />
    <input type="submit" value="upload" />
</form>

Spring MVC – 高级 @RequestMapping 选项

  除了使用URL模板之外,@RequestMapping 注解也支持 Ant-style 风格的路径(例如:/myPath/*.do)。两种风格混合使用也是支持的(例如:/owners/*/pets/{petId})。

  如果路径没有明确指定映射,这时候就靠方法名来识别,依照 MethodNameResolver 类来处理(默认情况下是 InternalPathMethodNameResolver 类),这只适用于注解的路径不匹配请求的路径。换句话说,只用于减小其中一系列的匹配规则,不构成映射的首选。

  如果有一个没有指明映射路径的方法,那么同样所有的没有指明映射方法的请求都将调用它。如果有多个方法,也会依据方法名来选择。

  可以在请求路径中加入些参数来减小映射范围,例如加上"myParam=myValue"之类的参数(注:类似 struts 的method=methodName),这样请求就会映射到存在对应value参数的方法,例如:

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping(value = "/pets/{petId}", params="myParam=myValue")
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    // implementation omitted
  }
}

  "myParam" 这样的参数风格是支持的,当在请求中的参数中包含的时候(可以使用任何的值)。最后说下,"!myParam"参数风格指定了它不应该出现在请求路径中。

  同样的,请求头(header)也能用于减小映射路径范围。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping(value = "/pets", method = RequestMethod.POST, headers="content-type=text/*")
  public void addPet(Pet pet, @PathVariable String ownerId) {
    // implementation omitted
  }
}

  在上面的例子中,addPet() 方法只在 content-type 匹配 text/* 才会被调用,例如:text/xml。

  原文:link

Spring MVC – URI Templates

  在spring mvc中通过url路径来访问控制器中的方法,可以在用@RequestMapping注解的路径中使用URI模板。使用@PathVariable注解来指明方法中的参数应该对应URI模板中的变量,如下例子:

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable String ownerId, Model model) {
  Owner owner = ownerService.findOwner(ownerId);
  model.addAttribute("owner", owner);
  return "displayOwner";
}

  URI模板”/owners/{ownerId}”指定了变量名为ownerId。当方法被请求的时候ownerId的值会被赋值为请求的URI,比如一个请求为/owners/fred,那么方法中的ownerId参数会赋值为fred。必须保证参数名和URI模板变量名一致才能自动赋值,想自定义参数变量需要在@PathVariable注解中加入参数,如下:

@RequestMapping(value="/owners/{ownerId}", method=RequestMethod.GET)
public String findOwner(@PathVariable("ownerId") String theOwner, Model model) {
  // implementation omitted
}

  当然,也可以使用多个@PathVariable来绑定多个URI模板变量,如下:

@RequestMapping(value="/owners/{ownerId}/pets/{petId}", method=RequestMethod.GET)
public String findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
  Owner owner = ownerService.findOwner(ownderId);
  Pet pet = owner.getPet(petId);
  model.addAttribute("pet", pet);
  return "displayPet";
}

  下面的代码展示使用变量作为相对路径,当请求为/owners/42/pets/21,会调用findPet()方法。

@Controller
@RequestMapping("/owners/{ownerId}")
public class RelativePathUriTemplateController {
  @RequestMapping("/pets/{petId}")
  public void findPet(@PathVariable String ownerId, @PathVariable String petId, Model model) {
    // implementation omitted
  }
}

  @PathVariable和方法中的参数可以是任何简单数据类型,例如:int,long,Date,等等。spring会自动转换,如果不匹配则抛出TypeMismatchException。

  原文:link

java使用google网址缩短

package com.dorole.util;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.net.URLConnection;

public class Googl
{
	private static String googUrl = "https://www.googleapis.com/urlshortener/v1/url";

	public static String shorten(String longUrl)
	{
		String shortUrl = "";
		try
		{
			URLConnection conn = new URL(googUrl).openConnection();
			conn.setDoOutput(true);
			conn.setRequestProperty("Content-Type", "application/json");
			OutputStreamWriter osw = new OutputStreamWriter(
					conn.getOutputStream());
			osw.write("{\"longUrl\":\"" + longUrl + "\"}");
			osw.flush();

			BufferedReader br = new BufferedReader(new InputStreamReader(
					conn.getInputStream()));
			String line;
			while ((line = br.readLine()) != null)
			{
				if (line.indexOf("id") > -1)
				{
					shortUrl = line.substring(8, line.length() - 2);
					break;
				}
			}
			osw.close();
			br.close();
		} catch (Exception ex)
		{
			ex.printStackTrace();
		}
		return shortUrl;
	}

	public static void main(String[] args)
	{
		String url = Googl.shorten("http://dorole.com");
		System.out.println(url);
	}
}

需要的地方调用Googl.shorten(), 参考:link, 引自:link

升级myeclipse 8.5 到 8.6

  好吧,一个星期没更新了,一上来又是一篇关于升级的文章,版本控,莫怪~~

  作为一个敲代码的人,自然要有一款得心应手的集成开发环境,myeclipse 和 netbeans 就是不错的选择,随着语言的进步,框架的更新升级,自然ide也要更新。官网在八月初就放出了8.6正式版,这一次的更新主要是对javascript提供了更强大的支持,官方宣传就是

JavaScript Devs Smarter, Application Management Simpler

  支持javascript的oop,支持大部分的js开源框架,例如jQuery,DOJO 和 YUI。意味着在写jquery都可以有自动提示,这也是我的最爱。还有其他的一大堆更新不罗嗦了。

  本来想下载8.6的完整安装包再全新安装,不过800多兆下载也不容易,于是进管理中心去升级,好家伙,居然也要400多兆,更新界面道是蛮漂亮的。

  友情提示自动更新需自备vpn,否则用迅雷下载完整版:

  照例放上高清大图一张

myeclipse

linux中oracle,java,tomcat设置环境变量

  最近配置的一台linux服务器,主要有oracle 11g, jdk1.6, apache和tomcat做web服务器,jk桥接。其中环境变量真啰嗦,在此留个记录,备用。

JAVA_HOME=/usr/local/jdk1.6.0_21
JAVA_BIN=/usr/local/jdk1.6.0_21/bin
CATALINA_HOME=/usr/soft/tomcat
CATALINA_BASE=/usr/soft/tomcat
CATALINA_TMPDIR=/usr/soft/tomcat/temp
ORACLE_SID=orcl
ORACLE_BASE=/home/user/app/user
ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
PATH=$PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$ORACLE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/bin/bootstrap.jar
export JAVA_HOME JAVA_BIN CATALINA_HOME CATALINA_BASE CATALINA_TMPDIR ORACLE_SID ORACLE_BASE ORACLE_HOME PATH CLASSPATH

  export一气呵成,美观实用。想要全局有效就添加在/etc/bashrc最后。只对某个用户有效,则添加在/home/user/.bashrc末尾。其实只不过是在~/.bashrc中调用了/etc/bashrc而已。。

MSSQL的备份语句

  以前使用mssql的备份语句的时候都是以当前时间作为文件名,这样每次备份都产生不同的文件,就不会遇到追加和覆盖备份的问题。而现在需要在一个指定的文件名中进行备份,会发现每次备份后文件体积会越来越大。这是因为每次备份默认都是追加的,保留了历史备份。

  在management studio中操作备份时可以在选项中更改追加或覆盖,而在程序中使用BACKUP DATABASE语句备份时可以使用WITH INIT | NOINIT来指定是否覆盖。init表示覆盖,noinit追加。
例如:

BACKUP DATABASE WMSDB TO DISK = 'C:\Tomcat\temp\WMSDB.BAK' WITH INIT

  参考http://technet.microsoft.com/zh-cn/library/ms186865(SQL.105).aspx

ubuntu 10.04安装MyEclipse 8.5

  最近打算把开发环境换到linux平台,刚脆就搬到新装的ubuntu10.04中。

  新的ubuntu系统中去除了sun的jdk,取而代之的是OpenJDK,但这个并不适合用来开发。

  首先在新立得中搜索openjdk全部删除。并添加软件源来安装sun-java6-jdk

root@dorole:~# add-apt-repository "deb http://archive.canonical.com/ lucid partner"
root@dorole:~# apt-get update
root@dorole:~# apt-get install sun-java6-jdk

  安装完成后可以输入

root@dorole:~# java -version

  确认安装成功。如果有OpenJDK字样说明openjdk没删除干净。
Continue reading