??xml version="1.0" encoding="utf-8" standalone="yes"?>
但更多情况下Q我们是把它当做复选(多项选择Q来用,q有两种情况用checkbox来设|集合:
一.checkbox name相同
在一个String cd的Set 集合里面存放许多权限Q用checkbox的HTML如下Q?br /><input type="checkbox" name="user.priv" value="boss"/>
<input type="checkbox" name="user.priv" value="admin"/>
<input type="checkbox" name="user.priv" value="manager"/>
比方_一个用户选中前面的两,览器将会送出q查询串Q?user.priv=boss&user.priv=admin?br />OGNL会处理查询Ԍaction.getUser().setPriv(String[] {"boss", "admin"})?br />Action里面的方法将会是q样Q?br />Set m_privileges = new HashSet();
public void setPriv(String[] privs) {
for (int i = 0; i < privs.length; i++) {
m_privileges.add(privs[i]);
}
}
?checkbox name不同
有三U处理方式:
I.
<input type="checkbox" name="xlist[0].id" value="444">
<input type="checkbox" name="xlist[1].id" value="443">
<input type="checkbox" name="xlist[2].id" value="442">
* Action中用List集合来处理:private List xlist = new XWorkList(User.class)
public List getXlist(){
return xlist;
}
II.
<input type="checkbox" name="xmap['0'].id" value="444">
<input type="checkbox" name="xmap['1'].id" value="443">
<input type="checkbox" name="xmap['2'].id" value="442">
* Action中用Map集合来处理:private Map xmap = new XWorkMap(User.class)
public List getXmap(){
return xmap;
}
III.
<input type="checkbox" name="xarray[0]." value="444">
<input type="checkbox" name="xarray[1]" value="443">
<input type="checkbox" name="xarray[2]" value="442">
*Action中用Object[]数组来处理(注意数组的长度必M先确定,不可以动态改动数l的大小Q:
private Object[] xarray = new Object[3]
public Object[] getXarray(){
return xarray;
}
下面用一个稍为复杂一点的例子来加深对List集合处理方式的理解,其它处理方式都是异曲同工?br />multiSelect.jsp文g
<%@page pageEncoding="gb2312" contentType="text/html;charset=gb2312"%>
<%@taglib prefix="ww" uri="webwork" %>
<html>
<body>
<form name="multi" method="post" action="multiSelect.action">
<%int i = 0; %>
<ww:iterator value="ulist">
<%
String cName = "xlist["+i+"].id";
i++;
%>
<input type="checkbox" name="<%=cName%>" value="<ww:property value="id"/>">
<ww:property value="username"/>
<br>
</ww:iterator>
<input type="hidden" name="actionEvent" value="viewSelect">
<input type="submit" value="选择">
</form>
</body>
</html>
multiSelect_result.jsp文g
<%@page pageEncoding="gb2312" contentType="text/html;charset=gb2312"%>
<%@taglib prefix="ww" uri="webwork" %>
<html>
<body>你的选择是:<br>
<ww:iterator value="xlist">
<ww:property value="id"/>
<br>
</ww:iterator>
</body>
</html>
MultiSelectAction.java文g
package com.wzj.rbac.webwork.action;
import java.util.List;
import com.opensymphony.xwork.Action;
import com.opensymphony.xwork.util.XWorkList;
import com.wzj.framework.spring.resource.BeanLocator;
import com.wzj.rbac.ServiceFacade.UserService;
import com.wzj.rbac.domain.object.User;
/**
* @desc 复选框 选择提交Actionc?br /> * @author chikai<br>
* @link <a href="mailto:wzj616@etang.com">chikai</a>
* @version $ MultiSelectAction.java 2004-12-5 19:11:54 $
* @version $ Project xwork
*/
public class MultiSelectAction implements Action {
private final static String PRE_SUCCESS = "pre_success";
//用户列表
private List ulist;
//选择的用?br /> private List xlist = new XWorkList(User.class);
private UserService uService;
//面执行动作判断
private String actionEvent;
public String execute() throws Exception {
if(actionEvent!=null&&actionEvent.equals("viewSelect"))
{
for(int s=0;s<xlist.size();s++){
if(((User)xlist.get(s)).getId()==null){
xlist.remove(s);
s--;
}
}
return SUCCESS;
}
//获取用户业务服务
uService = BeanLocator.getGlobalServiceLocator().getUserService();
ulist = uService.getAllUser();
return PRE_SUCCESS;
}
public List getUlist(){
return ulist;
}
public List getXlist(){
return xlist;
}
public void setActionEvent(String ae){
actionEvent = ae;
}
}
xwork.xml文gQ?/p>
单的?span lang="EN-US">log4j是帮助开发h员进行日志输出管理的APIcd。它最重要的特点就
可以 配置文g灉|的设|?/span> 日志信息的优先、日志信息的输出目的C及日志信息的输出格式?span lang="EN-US">
Log4j除了可以记录E序q行日志信息外还有一重要的功能就是用?/span> 昄调试信息。程序员l常会遇到脱?span lang="EN-US">java ide环境调试E序的情况,q时大多Ch会选择使用System.out.println语句输出某个变量值的Ҏq行调试。这样会带来一个非帔R烦的问题Q一旦哪天程序员军_不要昄q些System.out.println的东西了只能一行行的把q些垃圾语句注释掉。若哪天又需调试变量|则只能再一行行Lq些注释恢复System.out.println语句。用log4j可以很好的处理类似情c?/span>
log4j使用Ҏ
下面介绍的是log4j一些理论方面的知识Q读者觉得枯燥的话可以蟩q本节直接阅ȝ三节实例部分?/span>
1、定义配|文?/span>
首先使用配置文g我们的应用程序更加灵z配|log日志输出方式包括输出优先U、输出目的地、输出格式。Log4j支持两种配置文g格式Q一U是XML 格式的文Ӟ一U是JavaҎ文件log4j.propertiesQ键=|。下面将介绍使用log4j.properties文g作ؓ配置文g的方法:
?/span> 配置根LoggerQ其语法为:0
log4j.rootLogger = [ level ] , appenderName, appenderName, ?
其中Q?span lang="EN-US">level 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?
?/span> 配置日志信息输出目的地AppenderQ其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
?
log4j.appender.appenderName.option = valueN
其中Q?/font>
Log4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?br /> org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
?/span> 配置日志信息的格式(布局Q,其语法ؓQ?/span>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
?
log4j.appender.appenderName.layout.option = valueN
其中Q?/font>
Log4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?
%n 输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n?
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|
2002q?0?8?/font>
22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)
2、在代码中用Log4j
?/span> 得到记录?/span>
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器?span lang="EN-US">Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
?/span> d配置文g
当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?br /> PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?/font>
例:PropertyConfigurator.configure
(".\\src\\log4j.properties")
DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/font>
?/span> 插入记录信息Q格式化日志信息Q?/span>
当上两个必要步骤执行完毕Q就可轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
log4j范例E序
下面用一个最单的范例E序来进一步说?span lang="EN-US">log4j的用方法。程序代码如下:
import org.apache.log4j.*;
public class LogTest {
static Logger logger = Logger.getLogger(LogTest.class.getName());
public static void main(String[] args) {
PropertyConfigurator.configure ( ?\\src\ log4j.properties ? Q?/span>
logger.debug( "Debug ..." );
logger.info( "Info ..." );
logger.warn( "Warn ..." );
logger.error( "Error ..." );
}
}
E序说明Q?span lang="EN-US">
?/span> static Logger logger = Logger.getLogger(LogTest.class.getName()); 是创徏一个属?/span> LogTest cȝ Logger 对象Q创建时要告?/span> Logger 你当前的 Class 是什么?/span>
?/font> PropertyConfigurator.configure ( ?/span> log4j.properties ? 是说用当前工E目录下?/span> src 文g夹中?/span> log4j.properties 文g作ؓ配置文g。若?/span> log4j.properties 攑֜工程根目录下也可不写此句Q程序会自动扑ֈ配置文g?/span>
?/font> logger.debug 是输出 debug 的信息, logger.info 是输出提示信息Q?/font> logger.warn 是昄警告信息Q?/font> logger.error 是昄错误信息?/font>
下面是配|文?/font> log4j.properties 的内容:
log4j.rootCategory=DEBUG, stdout Q?/span> R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p (%F:%L) - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log.txt
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d { yyyy MMM dd HH:mm:ss } %-5p %c - %m%n
E序说明Q?span lang="EN-US">
?/span> log4j.rootCategory=DEBUG, stdout Q?/span> R
是说我要显C所有优先权{於和高?/font> Debug的信息?br />"stdout"Q?/font> ”R?/font> 表示我定义了两个输出?/font> ( 随便什么名字都?/font> ) ?/font>
?/font> 下面的三行说 stdout 输出端其实是标准输出 Console Q也是屏幕。输出的格式?/font> Pattern Layout 。{换方式是 %5p (%F:%L) - %m%n Q即前五格用来显CZ先权Q再昄当前的文件名Q加当前的行数。最后是 logger.debug() ?/span> logger.info() ?/span> logger.warn() ?/span> logger.error() 里的信息?/span> %n 表示回RI?/span>
?/font> 再加上下面六行则 log 信息不光昄在屏q上Q而且被保存在一个叫 "log.txt" 的文仉Q文件最大ؓ 100KB 。如果文件大超q?/font> 100KB Q文件会被备份成 "log.txt.1" Q新?/font> "log.txt" l箋记录 log 信息?/font>
接下来我们可以改?/font> log4j.properties Q而不需重新~译可以控?/font> log 信息是否昄?/font> log 信息的输出端cd、输出方式、输出格式,{等。D例如下:
?/font> ?/font> log4j.properties 文g里把 "log4j.rootCategory=DEBUG,stdout,R" 改写?/font> "log4j.rootCategory=OFF, stdout,R" Q这h有的 log信息都不会显CZQ解决了本文开始提出的问题?br />?/font> ?/font> log4j.properties 文g里把 "log4j.rootCategory=DEBUG,stdout,R" 改写?/font> "log4j.rootCategory=INFO, stdout,R" Q这样只昄 INFO, WARN, ERROR ?/font> log 信息Q?/font> DEBUG 信息不会被显C;
?span lang="EN-US">webE序中用log4j注意问题
1?span style="FONT: 7pt 'Times New Roman'"> ׃jsp或servlet在执行状态时没有当前路径概念Q所有?/span> PropertyConfigurator.configure Q?/span> String Q语句找 log4j.properties 文g时要l出相对于当?/span> jsp ?/span> servlet 的\径{化成Z个绝对的文gpȝ路径。方法是使用 servletcontext.getrealpath(string) 语句。例Q?/span>
//得到当前jsp路径
String prefix = getServletContext().getRealPath( "/");
//d log4j.properties
PropertyConfigurator.configure(prefix+ "\\WEB-INF\\log4j.properties");
2、相应的log4j.properties讄某个属性时也要在程序中讄l对路径。例Q?/font>
log4j.appender.R.File属性设|日志文件存放位|。我们可以用d.properties配置文g的方法进行灵z设|?span style="COLOR: black">
log4e使用说明
在了解了log4j的功能后Q我们肯定会我们的程序中 ~写一?/span> Log4j 日志记录。对于?/span> Eclipse 的程序员 Log4e 是我们最得力?/span> log4j 日志~写助手Q现在开?/span> Log4e 之旅?/span>
Log4e 是一个免费的 Eclipse Plugin Q它可帮助你在你?/font> Java 工程中快速加?/font> Log Q?/font> 我们可以?/font> http://log4e.jayefem.de/index.php/Download |站上下?/font> Log4e 最新版本。下载后相应文件夹拯?/font> Eclipse 的插件目录下Q重?/font> Eclipse Q在首选项中会多出一?/font> Log4e 选项?/font>
Log4e 可以有多个插?/font> Log Z个方法、类Q当然也可以在当前位|插?/font> Log Q同时其也可以把 Sysout.out.println() 的{换ؓ log Q所有的q一切只需要你点点鼠标或者按一ơ快捷键Q下面我们只以ؓ一个方法插?/font> Log Z来讲?/font>
?/font> Java ~辑上下文中点击右键Q选择 Log4E Q你看到如下界面:
点击
Insert Log Statement For This Method
Q你看到验证页面:
Qform enctype="multipart/form-data" method="POST" action="..."Q?br />...
Qinput type="file" name="..."Q?br />...
Q?formQ?/p>
但是事情qq么单,因ؓ实现servlet和JSP规范的应用程序服务器不一定能够处理multipart/form-data~码方式。因此,你必d析请求的输入,例如Apache通用文g上蝲是一个小型的JavaE序包,它让你能够从~码的数据中获取被上载文件的内容。这个程序包的API是很灉|的,它允怽把小文g存储在内存中Q把大文件存储在盘的时目录中。你可以指定一个文件大的阀|大于q个值的文g都会被写到磁盘上Q而不会保留在内存中,而且你还可以规定允许的被上蝲文g的最大大?br />
前面提到的org.apache.commons.fileuploadE序包包含一个叫作DiskFileUpload的类Q它的parseRequest()Ҏ获取HttpServletRequest参数Qƈq回org.apache.commons.fileupload.FileItem实例列表。编码后的窗体数据从servleth的getInputStream()Ҏ所q回的数据流中d。FileItemq个名字Ҏ使h误解Q因个接口的实例同时表现了被上蝲的文件和正常的请求参数?br />
通用文g上蝲E序包所提供的API赋予了你讉K分解后的H体数据的权利,但是servleth的getParameter()和getParameterValues()Ҏ却无法工作。这是一个难题,因ؓ在输入字Dc检查框、单选框和列表框后台q行的JSFlg需要调用这两个Ҏ。我们可以利用Servlets API提供的两个特性(qo器和h包装器)来解册个问题。下一部分描述了Apache MyFaces如何实现qo器,d了大量必要的Ҏ件上载的支持Q而不会中断已有的JSFlg。此外,MyFaces为JavaBeans提供了APIQ同时还提供了一个定制的JSFlgQ它表现为<input type="file"Q元素?/p>
配置JSF和MyFaces扩展
目前QJSF规范的主要实现是JSF参考实玎ͼRIQ,与此同时QApache提供了另外一个实玎ͼ是MyFaces。当然可能存在其它一些JSF实现Q但是JSF RI和MyFaces是其中最行的两个。很多开发者更喜欢前者,因ؓSun把它UCؓ"官方?实现Q但是,MyFaces拥有一些有的扩展Q例如对上蝲文g操作的支持)。如果你愿意Q可以把MyFaces扩展与Sun的JSF RI一起用。你只需要把myfaces-extensions.jar文g、JSF RI的JAR文g和commons-fileupload-1.0.jar文g一h到自qweb应用E序的WEB-INF/lib目录中就可以了。下面是需要的JAR文gQ?br />
JSF 1.1 RI jsf-api.jarjsf-impl.jar
JSTL 1.1 RI jstl.jarstandard.jar
MyFaces扩展 myfaces-extensions.jar
Apache CommonsQ供JSF和MyFaces 扩展使用Q?commons-collections.jarcommons-digester.jarcommons-beanutils.jarcommons-logging.jarcommons-fileupload-1.0.jar
Q?xml version="1.0" encoding="UTF-8"?Q?br />
Q?DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd"Q?br />
Qweb-appQ?br />
Qcontext-paramQ?br />Qparam-nameQjavax.faces.STATE_SAVING_METHODQ?param-nameQ?br />Qparam-valueQclientQ?param-valueQ?br />Q?context-paramQ?br />
QservletQ?br />Qservlet-nameQFacesServletQ?servlet-nameQ?br />Qservlet-classQ?br />javax.faces.webapp.FacesServlet
Q?servlet-classQ?br />Qload-on-startupQ?Q?load-on-startupQ?br />Q?servletQ?br />
Qservlet-mappingQ?br />Qservlet-nameQFacesServletQ?servlet-nameQ?br />Qurl-patternQ?faces/*Q?url-patternQ?br />Q?servlet-mappingQ?br />
Qservlet-mappingQ?br />Qservlet-nameQFacesServletQ?servlet-nameQ?br />Qurl-patternQ?.facesQ?url-patternQ?br />Q?servlet-mappingQ?br />
QfilterQ?br />Qfilter-nameQExtensionsFilterQ?filter-nameQ?br />Qfilter-classQ?br />org.apache.myfaces.component.html.util.ExtensionsFilter
Q?filter-classQ?br />Qinit-paramQ?br />Qparam-nameQuploadMaxFileSizeQ?param-nameQ?br />Qparam-valueQ?0mQ?param-valueQ?br />Q?init-paramQ?br />Qinit-paramQ?br />Qparam-nameQuploadThresholdSizeQ?param-nameQ?br />Qparam-valueQ?00kQ?param-valueQ?br />Q?init-paramQ?br />Q?filterQ?br />
Qfilter-mappingQ?br />Qfilter-nameQExtensionsFilterQ?filter-nameQ?br />Qservlet-nameQFacesServletQ?servlet-nameQ?br />Q?filter-mappingQ?br />
Qwelcome-file-listQ?br />Qwelcome-fileQindex.jspQ?welcome-fileQ?br />Q?welcome-file-listQ?br />
Q?web-appQ?/p>
前面CZ中的两个qo器(filterQ参数告诉MyFaces把小?00K的文件放入内存中Qƈ且忽略(即不处理Q占?0MB以上盘I间的文件。大介于uploadThresholdSize和uploadMaxFileSize之间的文件将作ؓ临时文g存储在磁盘上。如果你试图载入一个太大的文gQMyFaces当前版本忽略所有的H体数据Q就像用h交了一个空表单一栗如果你希望l上载文件失败的用户一些提CZ息,需要更改MyFaces的MultipartRequestWrapperc,扑ֈ捕捉SizeLimitExceededException异常的位|,q用FacesContext.getCurrentInstance().addMessage()来警告用戗?br />
前面提到QMyFaces扩展包含了文件上载组Ӟ我们可以在JSF面中用它。下一部分介l如何实现这L操作?使用MyFaces的文件上载组件?br />
Z在web面中用JSF和MyFacesQ你必须在<%@taglib%Q指令中声明它们的标记库Q?br />
Q?@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%Q?br />Q?@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%Q?br />Q?@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%Q?/p>
JSF的<h:formQ标记没有method属性,q是因ؓ它只支持POSTҎQ但它拥有enctype属性,如果你希望上载文Ӟ必M用该属性,把窗体数据设|ؓ多部分(multipartQ编码类型:
Qf:viewQ?br />Qh:form id="MyForm" enctype="multipart/form-data" Q?br />...
Qx:inputFileUpload id="myFileId"
value="#{myBean.myFile}"
storage="file"
required="true"/Q?br />...
Q?h:formQ?br />Q?f:viewQ?/p>
MyFaces的<x:inputFileUploadQ标C你能够定义UIlg的属性,它的呈现部gQrendererQ生成<input type="file"Q元素。org.apache.myfaces.custom.fileuploadE序包包含了UIlgc(HtmlInputFileUploadQ、呈现部ӞHtmlFileUploadRendererQ、定制的标记处理E序QHtmlInputFileUploadTagQ、UploadedFile接口和其它一些辅助类。HtmlInputFileUploadcL展了JSF标准的HtmlInputTextlgQ重载了它的一些方法。HtmlFileUploadRenderer负责生成HTML标记Q从MultipartRequestWrapper中获取FileItem?br />
MyFacesq没有让你直接访问通用文g上蝲所建立的FileItem实例Q它提供了自qUploadedFile接口来获取被上蝲的文件的内容、内容类型、文件名和文件大。JSFH体的后台bean必须拥有一个UploadedFilecd的属性。前面的例子用JSF表达式(#{myBean.myFile}Q把UIlg的值绑定到了这样一个bean上。JSF框架lg获取HtmlInputFileUploadlg的|它是一个UploadedFile实例Qƈ且会讄后台bean的myFile属性:
import org.apache.myfaces.custom.fileupload.UploadedFile;
...
public class MyBean {
private UploadedFile myFile;
public UploadedFile getMyFile() {
return myFile;
}
public void setMyFile(UploadedFile myFile) {
this.myFile = myFile;
}
...
}
CZ应用E序
前面的部分介l了是MyFaces如何在通用文g上蝲的帮助下支持文g上蝲的。现在我们来看一个实际的利用了这U特性的应用E序。JSFH体QMyForm.jspQ让用户选择一个文件和一个报文摘要算法,后台beanQ?MyBean.javaQ用这个算法计出一个散列|昄在另外一个web面QMyResult.jspQ中。这些页面和后台bean通过一个JSF配置文gQfaces-config.xmlQ结合在一赗?br />
MyForm.jsp面
q个JSFH体使用了MyFaces的<x:inputFileUploadQ标讎ͼ同时q用了其它一些标准的JSF标记来呈现标{、消息、包含报文摘要算法的下拉列表、用JSF表达式(#{myBean.processMyFile}Q指定了处理被上载文件的操作Ҏ的命令按钮:
Q?@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%Q?br />Q?@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%Q?br />Q?@ taglib uri="http://myfaces.apache.org/extensions" prefix="x"%Q?br />
Qf:viewQ?br />Qh:form id="MyForm" enctype="multipart/form-data" Q?br /> Qh:messages globalOnly="true" styleClass="message"/Q?br /> Qh:panelGrid columns="3" border="0" cellspacing="5"Q?br /> Qh:outputLabel for="myFileId" value="File: "/Q?br /> Qx:inputFileUpload id="myFileId" value="#{myBean.myFile}" storage="file" required="true"/Q?br /> Qh:message for="myFileId"/Q?br /> Qh:outputLabel for="myParamId" value="Param: "/Q?br /> Qh:selectOneMenu id="myParamId" value="#{myBean.myParam}" required="true"Q?br /> Qf:selectItem itemLabel="" itemValue=""/Q?br /> Qf:selectItem itemLabel="MD5" itemValue="MD5"/Q?br /> Qf:selectItem itemLabel="SHA-1" itemValue="SHA-1"/Q?br /> Qf:selectItem itemLabel="SHA-256" itemValue="SHA-256"/Q?br /> Qf:selectItem itemLabel="SHA-384" itemValue="SHA-384"/Q?br /> Qf:selectItem itemLabel="SHA-512" itemValue="SHA-512"/Q?br />Q?h:selectOneMenuQ?br />Qh:message for="myParamId"/Q?br />
Qh:outputText value=" "/Q?br />Qh:commandButton value="Submit"
action="#{myBean.processMyFile}"/Q?br />Qh:outputText value=" "/Q?br />
Q?h:panelGridQ?br />Q?h:formQ?br />Q?f:viewQ?/p>
MyBeanc?br />
后台bean拥有三个属性:myFile、myParam和myResult。前面已l解释了myFile属性的角色。它让你获取被上载文件的内容和文件名、文件大、内容类型。myParam属性的值是报文摘要法。myResult属性将保存processMyFile()Ҏ执行之后的散列倹{MyBeancMؓ自己的所有属性提供了get和setҎQ?br />
package com.devsphere.articles.jsfupload;
import org.apache.myfaces.custom.fileupload.UploadedFile;
...
public class MyBean {
private UploadedFile myFile;
private String myParam;
private String myResult;
public UploadedFile getMyFile() {
return myFile;
}
public void setMyFile(UploadedFile myFile) {
this.myFile = myFile;
}
public String getMyParam() {
return myParam;
}
public void setMyParam(String myParam) {
this.myParam = myParam;
}
public String getMyResult() {
return myResult;
}
public void setMyResult(String myResult) {
this.myResult = myResult;
}
...
}
package com.devsphere.articles.jsfupload;
...
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.io.*;
public class MyBean {
...
public String processMyFile() {
try {
MessageDigest md= MessageDigest.getInstance(myParam);
InputStream in = new BufferedInputStream(
myFile.getInputStream());
try {
byte[] buffer = new byte[64 * 1024];
int count;
while ((count = in.read(buffer)) Q?0)
md.update(buffer, 0, count);
} finally {
in.close();
}
byte hash[] = md.digest();
StringBuffer buf = new StringBuffer();
for (int i = 0; i Q?hash.length; i++) {
int b = hash[i] & 0xFF;
int c = (b Q> 4) & 0xF;
c = c Q?10 ? '0' + c : 'A' + c - 10;
buf.append((char) c);
c = b & 0xF;
c = c Q?10 ? '0' + c : 'A' + c - 10;
buf.append((char) c);
}
myResult = buf.toString();
return "OK";
} catch (Exception x) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_FATAL,
x.getClass().getName(), x.getMessage());
FacesContext.getCurrentInstance().addMessage(null, message);
return null;
}
}
}
Q?xml version="1.0" encoding="UTF-8"?Q?br />
Q?DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd"Q?br />
Qfaces-configQ?br />
Qmanaged-beanQ?br />Qmanaged-bean-nameQmyBeanQ?managed-bean-nameQ?br />Qmanaged-bean-classQ?br />com.devsphere.articles.jsfupload.MyBean
Q?managed-bean-classQ?br />Qmanaged-bean-scopeQrequestQ?managed-bean-scopeQ?br />Q?managed-beanQ?br />
Qnavigation-ruleQ?br />Qfrom-view-idQ?MyForm.jspQ?from-view-idQ?br />Qnavigation-caseQ?br />Qfrom-outcomeQOKQ?from-outcomeQ?br />Qto-view-idQ?MyResult.jspQ?to-view-idQ?br />Q?navigation-caseQ?br />Q?navigation-ruleQ?br />
Q?faces-configQ?/p>
MyResult.jsp面
q个web面昄了被上蝲文g的一些信息:
Q?@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%Q?br />Q?@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%Q?br />
Qf:viewQ?br />
Qh:panelGrid columns="2" border="0" cellspacing="5"Q?br />
Qh:outputText value="FileName:"/Q?br />Qh:outputText value="#{myBean.myFile.name}"/Q?br />
Qh:outputText value="FileSize:"/Q?br />Qh:outputText value="#{myBean.myFile.size}"/Q?br />
Qh:outputText value="Param:"/Q?br />Qh:outputText value="#{myBean.myParam}"/Q?br />
Qh:outputText value="Result:"/Q?br />Qh:outputText value="#{myBean.myResult}"/Q?br />
Q?h:panelGridQ?br />
Q?f:viewQ?/p>
被显C的文g名可能带有客L文gpȝ的完整\径,如下所C: