??xml version="1.0" encoding="utf-8" standalone="yes"?> 4return.jsp <%@ page language="java" pageEncoding="utf-8"%> </body> import java.io.File; import javax.servlet.ServletConfig; import org.apache.commons.io.FileUtils; import com.opensymphony.xwork2.ActionSupport; @Controller("imgAciton") public File getUpload() { public void setUpload(File upload) { public String getUploadContextType() { public void setUploadContextType(String uploadContextType) { public String getUploadFileName() { public void setUploadFileName(String uploadFileName) { public String getImgFileName() { public void setImgFileName(String imgFileName) { // 通过struts2的配|文件得C传目录,q个是很重要?br /> public String getImagePath() throws IOException { public void setImagePath(String imagePath) { public String getCallbackName() { public void setCallbackName(String callbackName) { private String getExtention(String fileName) { @Override } @Override @Override } @Override
]]>
]]>
1.
<tr>
<td align="right">q告囄<font color="red">*</font>Q?lt;/td>
<td align="left">
<input type="button" id="show_upload_pic_but" name="show_upload_pic_but" value="上传囄" onclick="showUploadWin('ad_upload','callbackFun')"/>
<div id="pic_content">
</div>
</td>
</tr>
2.
function showUploadWin(imagePath,callbackName){
try{
var content=[];
content.push("<table id='upload_tabel'>");
content.push("<tr>");
content.push("<td align='center' style='padding: 10px;'>");
content.push('<form name="upload_pic_form" id="upload_pic_form" enctype="multipart/form-data" method="post" action="imgUpload.action" target="upload_frame" onsubmit="return checkUploadPic();">' );
content.push('<input type="hidden" name="imagePath" value="'+imagePath+'" />');
content.push('<input type="hidden" name="callbackName" value="'+callbackName+'" />');
content.push('<div style="margin-top:20px;">');
content.push('<input id="picFile" name="upload" type="file" style="width:260px;"/>');
content.push('</div>');
content.push('<div style="padding-left:20px; padding-top:10px;">');
content.push('<input type="submit" name="Submit" value=" ??" /> ');
content.push('<input type="reset" name="reset" value=" ?|?" />');
content.push('</div>');
content.push('</form>');
content.push("<iframe name='upload_frame' id='upload_frame' style='display:none' ></iframe>");
content.push("</td></tr>");
content.push("</table>");
//弹窗?br /> ymPrompt.win(content.join(''),300,200,'上传文g');
}
catch(e){
alert(e.message);
}
}
function callbackFun(flg,filepath){
if(flg=='success'){
var content=[];
content.push("<span><img src='"+showPicpath+"/"+filepath+"' width='150' height='150' />");
content.push("<input type='text' name='ad.file_path' value='"+filepath+"' readonly='true'/>");
content.push("</span>");
$("#pic_content").html(content.join(''));
closeUploadPicWin();
}
else{
alert("上传囄p|");
}
}
3
<action name="imgUpload" class="imgAciton" method="execute">
<interceptor-ref name ="fileUploadStack" />
<result name="showUpload">/jsp/advertisement/return.jsp</result>
</action>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>上传成功</title>
</head>
<body>
<%
out.print("<script type='text/javascript'>parent.");
%><s:property value='callbackName'/><%
out.print("('success','");
%><s:property value='imgFileName'/><%
out.print("')</script>");
%>
</html>
5
package com.gwtravel.action;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.ServletConfigAware;
@Scope("prototype")
public class UplaodImg extends ActionSupport implements ServletConfigAware,
ServletRequestAware, ServletResponseAware, SessionAware {
static Logger logger = Logger.getLogger(UplaodImg.class);
protected HttpServletRequest request;
protected HttpServletResponse response;
private ServletConfig servletConfig;
Map sessionMap;
private File upload;
private String uploadContextType;
private String uploadFileName;
private String imagePath;
private String callbackName;
private String imgFileName;//最后生成的文g?/p>
return upload;
}
this.upload = upload;
}
return uploadContextType;
}
this.uploadContextType = uploadContextType;
}
return uploadFileName;
}
this.uploadFileName = uploadFileName;
}
return imgFileName;
}
this.imgFileName = imgFileName;
}
//判断目录是否存在Q不存在则创?br /> FileUtils.forceMkdir(new File(ServletActionContext.getRequest().getRealPath("/"+imagePath)));
return ServletActionContext.getRequest().getRealPath("/"+imagePath);
}
this.imagePath = imagePath;
}
return callbackName;
}
this.callbackName = callbackName;
}
int pos = fileName.lastIndexOf(".");
return fileName.substring(pos);
}
@Override
public String execute() throws Exception {
String imgName = new Date().getTime() + getExtention(uploadFileName);
// logger.error(getImagePath() + "/"+ imgName);
System.out.println("test imgName: "+imgName);
this.imgFileName = imgName;
FileOutputStream fos = new FileOutputStream(getImagePath() + "/"+ imgName);
FileInputStream fis = new FileInputStream(getUpload());
byte[] buffer = new byte[1024];
int len = 0;
while ((len = fis.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
return "showUpload";
}
public String imgLogin1(){
String imguser=request.getParameter("username");
String imgpassword=request.getParameter("password");
sessionMap.put("imguser", imguser);
sessionMap.put("imgpassword", imgpassword);
return SUCCESS;
}
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
public void setServletResponse(HttpServletResponse arg0) {
// TODO Auto-generated method stub
this.response = arg0;
}
public void setSession(Map arg0) {
this.sessionMap=arg0;
public void setServletConfig(ServletConfig arg0) {
// TODO Auto-generated method stub
this.servletConfig = arg0;
}
}
]]>
<s:generator val="1,2,3,4,5,6" separator="," id="numbers">
<s:iterator value="#numbers" id="number">
<option value='<s:property value="number"/>'><s:property value="number"/>?lt;/option>
</s:iterator>
</s:generator>
</select>
l验2<s:generator val="%{'a,b,c,d,e,f,g,h,i,j'}" count="#request.hotel.star" separator=",">
<s:iterator><img src="images/star.gif" /></s:iterator>
</s:generator>
generator标签Q该标签可以指定字W串按指定分隔符分割成多个字丌Ӏ生成的多个字串可以?/span>iterator标签q行q代输出?/span>可以q么理解Q?/span>generator标签一个字W串转换成一?/span>List集合。在该标{体内,整个临时生成的集合将?/span>Valuestack的顶端,但一旦该标签l束Q生成的集合被U除Valuestack?/span>generator标签有如下几个属性:
1?/span>count属性:指定生成集合中元素的L。可选属性?/span>
2?/span>val属性:必填属性,指定被解析的字符丌Ӏ?/span>
3?/span>separator属性:q是一个必填属性,指定用于分割字符串的分隔W?/span>
4?/span>converter属性:可选属性,指定一个{换器Q{换器负责生成的集合中的每个字符串{换成对象Q通过q个转换器可以将一个含有分隔符的字W串解析成对象的集合。{换器必须一个?/span>org.apache.struts2.util.IteratorGenerator.Converter的对象?/span>
5?/span>var属性,可选属性。如果指定了该属性,则将生成的集合保存在Stack Context中。如果不指定该属性,则将生成的集合放?/span>ValueStack的顶端,该标{一l束Q生成的集合pU除。该属性也可替换成id?br />
jsp实例Q?/span>
package com.members.converter;
import java.util.Date;
import java.util.Map;
import org.apache.log4j.Logger;
import org.apache.struts2.util.StrutsTypeConverter;
import com.members.util.DateUtil;
public class DateYyyyMmDdConverter extends StrutsTypeConverter{
static Logger logger = Logger.getLogger(DateYyyyMmDdConverter.class);
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
if (values!= null &&
values.length > 0){
return DateUtil.getYyyyMmDd(values[0]);
}
else
return null;
}
@Override
public String convertToString(Map context, Object arg1) {
// TODO Auto-generated method stub
Date aDate = (Date)arg1;
return DateUtil.toHyphenatedYyyyMmdd(aDate);
}
}
正如你看到的那样Q这l单选按钮由一l|1??Q和一l行标(Atlanta、Chicago、DetroitQ构成,它们之间的键/值对应情况如下所C:
select元素也可以用来提供一l选项。下面的select元素Q如?-6所C)能够提供与刚才那l单选按钮一L选项?/p>
注意 在select元素里,value属性是可选的。如果没有给个属性,在某个选项被选中Ӟ该选项的行标将作ؓselect元素的D发送到服务器。从理论上讲Qradio元素的value属性也是可选的。可是,如果不给出value属性,单选按钮被选中时的值将?#8220;on”而不是相应的radio元素?label属性|q无疑会让同一个表单里的多个radio元素难以区别。因此,在用radio元素的时候往往必须l出它们的value属性?/p>
本节解释了list、listKey和listValue属性在radio、select 和其他用来提供一l选项的标{N的用方法。在使用q些标签Ӟ你们需要提供一些键/值对作ؓ那些选项的来源。在q?个属性当中,list属性是必不可少的,另外两个属性是可选的。我们可以把一个String、一个数l、一个java.util.Enumeration、一?java.util.Iterator、一个java.util.Map或一个Collection赋值给list属性,q个值对象既可以攑֜一个动作对象里Q也可以攑֜当前会话对象或当前ServletContext对象里?/p>
注意 如果你动态赋llist属性的对象没有M选项Q你必须q回一个空的数l?Collection/MapQ而不是返回一个空|nullQ?/p>
5.11.1 赋g个String
你可以将一个数l赋gؓString表示形式。例如,下面把一个字W串赋值给select标签Q?/p>
q个select标签呈CؓQ?/p>
h意,每个选项的值和行标使用的是同一个字W串元素?/p>
在绝大多数Struts应用E序里,选项的值和行标应该不同Q这需要用如下所C的语法Q?/p>
例如Q下面这个select标签
呈CؓQ?/p>
5.11.2 赋g个Map
如果你想让各个选项的g它的行标不同Q你可以使用一个Map作ؓ选项的来源。用Map作ؓ选项的来源很单:把选项的值用作Map的键、把选项的行标用作Map的键值即可。例如,以下代码创Z个名为cities的MapQ它包含3个城市的名字Q?/p>
如果cities是一个动作属性,你可以像下面q样把它赋值给list属性:
或者,如果cities是一个应用程序属性,你可以用如下所C的代码Q?/p>
5.11.3 赋g个Collection或一个对象数l?/p>
你还可以使用一个对象数l或一个对象Collection来作为选项的来源。此Ӟ你将需要用到list、listKey和listValue属性。具体做法是Q把那个数组或Collection赋值给list属性,把用来提供选项值的对象属性赋值给listKey属性,把用来提供选项行标的对象属性赋值给listValue属性?/p>
例如Q假设某个动作对象的getCitiesҎ返回一个以City对象为元素的ListQ而City对象有一个id和一个name属性,你就可以用如下所C的代码把这个List赋值给一个select标签Q?/p>