??xml version="1.0" encoding="utf-8" standalone="yes"?> public class MultiboxForm extends ActionForm { public String[] getMountains() { 接下来说RadioQ其实Form和Action部分都差不多Q只是JSP面有点不一PRadio里面甚至牉|CJavaScript?BR>1.From的设计:(x)
http://www-128.ibm.com/developerworks/java/library/j-sr3.html
http://www-128.ibm.com/developerworks/java/library/j-sr4.html
先调单的说v吧,我们来实现动态的checkbox:
1、Form的设计:(x)我们q个例子有个String[] mountainsQ这个变量数l中包含很多的山的名?q有个数lString[] selectedMountains是默认选中的一些山Q像下面q样很简单?/P>
2、Action的设计:(x)q个更单了Q一句话Q由控制器切换到视图?PRE class=code>
private String[] selectedMountains = {"Everest","K2","Lhotse","Cho Oyu"};
private String[] mountains ={"Everest","K2","Kangchenjunga","Lhotse","Makalu","Kangchenjunga South","Lhotse Middle","Kangchenjunga West","Lhotse Shar","Cho Oyu"};
return mountains;
}
public void setMountains(String[] mountains) {
this.mountains = mountains;
}
public String[] getSelectedMountains() {
return selectedMountains;
}
public void setSelectedMountains(String[] selectedMountains) {
this.selectedMountains = selectedMountains;
}
return mapping.findForward("success");
3、JSP的设计:(x)
q个相对比较复杂Q也是比较中要的?lt;logic:iterate/>是P代MultiboxForm中的mountians,
<html:form action="/multibox" name="multiboxForm" type="qiya.deng.struts.form.MultiboxForm">
<logic:iterate name="multiboxForm" property="mountains" id="mountain">
<html:multibox property="selectedMountains">
<bean:write name="mountain"/>
</html:multibox>
<bean:write name="mountain"/><br/>
</logic:iterate>
<br/>
<html:submit/><html:cancel/>
</html:form>
<html:multibox property="selectedMountains">
<bean:write name="mountain"/>
</html:multibox>
q个标签的作用就是selecteDMountains的值和q代的mountaing致的时候就?x)选中?
2.Action同上一P切换到JSP面厅R?nbsp;
private String selectedMountain = "Kangchenjunga West";
private String[] mountains ={"Everest","K2","Kangchenjunga","Lhotse","Makalu","Kangchenjunga South","Lhotse Middle","Kangchenjunga West","Lhotse Shar","Cho Oyu"};
public String[] getMountains() {
return mountains;
}
public void setMountains(String[] mountains) {
this.mountains = mountains;
}
public String getSelectedMountain() {
return selectedMountain;
}
public void setSelectedMountain(String selectedMountain) {
this.selectedMountain = selectedMountain;
}
3.重点部分JSP:
<html:form action="/radio" name="radioForm" type="qiya.deng.struts.form.RadioForm">
<bean:define id="selectedRadio" property="selectedMountain" name="radioForm"></bean:define>
<logic:iterate id="mountain" property="mountains" name="radioForm">
<bean:define id="mountainValue">
<bean:write name="mountain"/>
</bean:define>
<html:radio property="selectedMountain" value="<%=mountainValue%>" styleId="<%=mountainValue%>"/>
<bean:write name="mountain"/><br/>
</logic:iterate><br/>
<html:submit/><html:cancel/>
<script type="text/javascript">
<!--
var selectedRadio =
document.forms["radioForm"].elements["<bean:write name="selectedRadio"/>"];
selectedRadio.checked=true;
-->
</script>
</html:form>
"<bean:define/>"定义了一个PageContext作用域的属性selectedRadioQ下面的JavaScript的作用就是根据这个属性找到应该选中的Radio。其他的地方和上面那个很怼的。如果还是不太理解先q行Q看看生成的HTML代码?BR>
]]>
在它的网站上有比较详l的安装说明Qƈ且配有实例。需要的读者可以仔l查看,q里׃介绍了?BR>在用的JSP面中加?pre class="code">
<head>
<tab:tabConfig/>
</head>
q是导入一些CSS和JavaScript.
然后基本上就是两套标{:(x)
<tab:tabContainer>
<tab:tabPane>
从命名我们就很容易看出来是什么作?lt;tab:tabContainer>是相当于容器一L(fng)东西可以包含很多?lt;tab:tabPane>,?lt;tab:tabPane>是我们要的那种Tab的效果的面板?pre class="code">
<tab:tabContainer id="foo-bar-container">
<tab:tabPane id="foo" tabTitle="姓名">
<html:errors/><br/>
<bean:message key="tab_textfield_name"/>
<html:text property="userName"></html:text>
<br/>
<html:submit><bean:message key="tab_submit_label"/></html:submit>
</tab:tabPane>
<tab:tabPane id="bar" tabTitle="密码">
<html:errors/><br/>
<bean:message key="tab_textfield_password"/>
<html:password property="password"/>
<br/>
<bean:message key="tab_textfield_repassword"/>
<html:password property="rePassword"/>
<br/>
<html:submit><bean:message key="tab_submit_label"/></html:submit>
</tab:tabPane>
</tab:tabContainer>
注意上面的两个标{N有idq要是唯一的,而且是整个应用唯一?BR>
上面的代码就是一个表单,含有userName,password,rePassword三个文本域。但是需要一个Form,有没有考虑qForm攑֜什么位|呢Q经q试验我发现要将Form 攑ֈ<tab:tabContainer>的标{之外。这样就像处理一个普通的Struts Form一样了。如果你需要每个Tab也可以是个FormQ这样也没有什么问题?BR>
完整的JSP代码如下:
效果如图Q?BR>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="tab" uri="<%@ taglib prefix="html" uri="<%@ taglib prefix="bean" uri="<html>
<head>
<tab:tabConfig/>
</head>
<body>
<html:form action="/saveAll">
<tab:tabContainer id="foo-bar-container">
<tab:tabPane id="foo" tabTitle="姓名">
<html:errors/><br/>
<bean:message key="tab_textfield_name"/>
<html:text property="userName"></html:text>
<br/>
<html:submit><bean:message key="tab_submit_label"/></html:submit>
</tab:tabPane>
<tab:tabPane id="bar" tabTitle="密码">
<html:errors/><br/>
<bean:message key="tab_textfield_password"/>
<html:password property="password"/>
<br/>
<bean:message key="tab_textfield_repassword"/>
<html:password property="rePassword"/>
<br/>
<html:submit><bean:message key="tab_submit_label"/></html:submit>
</tab:tabPane>
</tab:tabContainer>
</html:form>
</body>
</html>
package com.motel168.util;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.validator.Field;
import org.apache.commons.validator.GenericValidator;
import org.apache.commons.validator.ValidatorAction;
import org.apache.commons.validator.ValidatorUtil;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.validator.Resources;
public class MyValidator {
public static boolean validateTwoFields(Object bean,ValidatorAction va,Field field,ActionErrors errors,HttpServletRequest request){
String value = ValidatorUtil.getValueAsString(bean,field.getProperty());
String sProperty2 = field.getVarValue("secondProperty");
String value2 = ValidatorUtil.getValueAsString(bean,sProperty2);
if(!GenericValidator.isBlankOrNull(value)){
try{
if(!value.equals(value2)){
errors.add(field.getKey(),Resources.getActionError(request,va,field));
return false;
}
}catch(Exception e){
errors.add(field.getKey(),Resources.getActionError(request,va,field));
return false;
}
}
return true;
}
}
然后使用的时候就和其他没什么两L(fng)了:(x)methodParams="java.lang.Object,org.apache.commons.validator.ValidatorAction,org.apache.commons.validator.Field,org.apache.struts.action.ActionErrors,javax.servlet.http.HttpServletRequest"
depends="required" msg="errors.twofield">
function validateTwoFields(form){
var bValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
oTwoFields = new twofields();
for(x in oTwoFields){
var field = form[oTwoFields[x][0]];
var secondField = form[oTwoFields[x][2]("secondProperty")];
if(field.type=="text"||field.type=="textarea"||field.type=="select-one"||field.type=="radio"||field.type=="password"){
var value;
var secondValue;
if(field.type=="select-one"){
var si = field.selectedIndex;
value = field.options[si].value;
secondValue = secondField.options[si].value;
}else{
value=field.value;
secondValue = secondField.value;
}
if(value!=secondValue){
if(i==0){
focusField = field;
}
fields[i++]=oTwoFields[x][1];
bValid = flase;
}
}
}
if(fiels.length > 0){
focusFiled.focus();
alert(fields.join('\n'));
}
return bValid;
]]>
是我们在javacMd的变量,它代表的是另外的一个域?br> 在JSP中的使用׃再说明了Q大功告?)?br>
secondProperty
newPassword2
2.相关讄
a.把上面提到的a,b,c,d四个包拷贝到<CATALINA_HOME>/common/lib目录?BR>b.把axis目录下的WEB-INF/lib目录下的文g全部拯?lt;CATALINA_HOME>/common/lib目录?BR>c.把JAVA_HOME/lib/tools.jar拯?lt;CATALINA_HOME>/common/lib目录?/P>
q样应该OK?
3.?TOMCAT_HOME%/config/server.xml文g中加入如下一D配|信??lt;/Host>之前)
4.写个单程序测试下Q?BR>
一、JSP面昄q
下面的显C页?display.jsp)出Cؕ码:(x)
<html>对不同的WEB服务器和不同的JDK版本Q处理结果就不一栗原因:(x)服务器用的~码方式不同和浏览器对不同的字符昄l果不同而导致的。解军_法:(x)在JSP面中指定编码方?gb2312),卛_面的第一行加上:(x)<%@ page contentType="text/html; charset=gb2312"%>Q就可以消除q了。完整页面如下:(x)
<head>
<title>JSP的中文处?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<%
out.print("JSP的中文处?quot;);
%>
</body>
</html>
<%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<%
out.print("JSP的中文处?quot;);
%>
</body>
</html>
二、表单提交中文时出现q
下面是一个提交页?submit.jsp)Q代码如下:(x)
<html>下面是处理页?process.jsp)代码Q?
<head>
<title>JSP的中文处?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<form name="form1" method="post" action="process.jsp">
<div align="center">
<input type="text" name="name">
<input type="submit" name="Submit" value="Submit">
</div>
</form>
</body>
</html>
<%@ page contentType="text/html; charset=gb2312"%>如果submit.jsp提交英文字符能正显C,如果提交中文时就?x)出Cؕ码。原因:(x)览器默认用UTF-8~码方式来发送请求,而UTF-8和GB2312~码方式表示字符时不一Pq样出C不能识别字符。解军_?通过request.setCharacterEncoding("gb2312")对请求进行统一~码Q就实现了中文的正常昄。修改后的process.jsp代码如下Q?pre class="code"><%@ page contentType="text/html; charset=gb2312"%>
<html>
<head>
<title>JSP的中文处?lt;/title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head><body>
<%=request.getParameter("name")%>
</body>
</html>
<body>
<%=request.getParameter("name")%>
</body>
</html>
三、数据库q接出现q
只要涉及(qing)中文的地方全部是qQ解军_法:(x)在数据库的数据库URL中加上useUnicode=true&characterEncoding=GBKO(jin)K了?
四、数据库的显CZؕ?
在mysql4.1.0?varcharcdQtextcd׃(x)出现中文qQ对于varcharcd把它设ؓ(f)binary属性就可以解决中文问题Q对于textcdp用一个编码{换类来处理,实现如下Q?
public class Convert {把它~译成classQ就可以调用Convertcȝ静态方法ISOtoGB()来{换编码?
/** 把ISO-8859-1码{换成GB2312
*/
public static String ISOtoGB(String iso){
String gb;
try{
if(iso.equals("") || iso == null){
return "";
}
else{
iso = iso.trim();
gb = new String(iso.getBytes("ISO-8859-1"),"GB2312");
return gb;
}
}
catch(Exception e){
System.err.print("~码转换错误Q?quot;+e.getMessage());
return "";
}
}
}
2.当然需要去下蝲iReport-0.5.1了,记得q的捎上个iTextAsian.jarQ这是我们中国h需要的东西?BR>解压iReport-0.5.1Q把\lib目录下的tinylaf.jar,mysql-connector-java-3.0.8-stable-bin.jarq两个文件删除,然后把iTextAsian.jar拯到\lib目录下(tinylaf.jar文g和iTextAsian.jar有冲H,tinylaf.jar文g删了不会(x)影响使用Q只是会(x)影响一点美观,应该不关pM大^_^Q,其他的配|都不需要了Q双击该目录下的iReport.batq行iReport?/P>
3.新徏一个文档看看,q往其中d一个Static TextQ写上中文,q择如下QFont name:宋体QPDF font nameQSTSong-Light,PDF Encoding:UniGB-UCS2-H(Chinese Simplified)q三必修修改,要不中文?x)有问题?BR>
4.讄 DataSource--Connections/DataSourceq新建,mysql讄如下,q要把你的驱动拷贝到\lib目录下,记得上面删了个mysql-connector-java-3.0.8-stable-bin.jar东西吗?q个东西不知道ؓ(f)什么也不能用,q是用mysql-connector-java-3.1.10-bin.jar?BR>
5.重新启动iReportQ再打开Connections/DataSource试下,应该?x)提CZ成功的。然后选择菜单builder-set active connection.q样可以用了SQL语句了。选择菜单View-Report query,写上句简单的SQL语句Q下面就?x)显C出字段?BR>
6.选择view-Report-fieldQ然后再d个Field到报表中按提C操作,提醒下,注意下字D늚cdQ不正确的话?x)出错。如果含有中问的话,处理同上3?/P>
q行下看下效?builder-Execute Report(using active conn))Q?/P>
下面我们以在tomcat中示范怎么配置和用log4j
环境讄Q用qtomcat的都知道Q应该把log4j.jar文g拯?TOMCAT_HOME%\common\lib中?BR>~辑servlet:
q在web.xml中加入如下配|:(x)
注意上面<param-value>中的"\"在linux要写?/"?BR>q有加上log4j.properties文g在WEB-INF目录?BR>
log4j.rootLogger=INFO, A1 , R
log4j.appender.A1=org.apache.log4j.ConsoleAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%nlog4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=log4j.log
log4j.appender.R.MaxFileSize=100KB
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
下面写了两个试的程序:(x)
servlet Test.java中:(x)
JSP temp.jsp中:(x)
q样?TOMCAT_HOME%\bin目录下会(x)产生log4j.log的文Ӟq就是日志文件?/P>
新徏一个配|文件log4j.propertiesQ?PRE class=code>
log4j.rootLogger=WARN, stdout, R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
# Pattern to output the caller's file name and line number.
#log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n
# Print the date in ISO 8601 format
log4j.appender.stdout.layout.ConversionPattern=%d [%t] %-5p %c - %m%n
log4j.appender.R=org.apache.log4j.RollingFileAppender
log4j.appender.R.File=example.log
log4j.appender.R.MaxFileSize=100KB
# Keep one backup file
log4j.appender.R.MaxBackupIndex=1
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n
# Print only messages of level WARN or above in the package com.foo.
log4j.logger.com.foo=WARN
~译q运行TestLog4j?x)在目录下生成一个example.log的文Ӟ屏幕也会(x)输出信息Q这证明已经你已l成功了W一步?BR>下面解释下这些配|文?BR>
log4j.rootLogger = [ level ], appendName1, appendName2, …appendNameN。同一个记录器可有多个输出端?BR>PSQlevel的别(此别可以自定义Q系l默认提供了以下U别Q?BR>debug//调试信息
info//一般信?BR>warn//警告信息
error//错误信息
fatal//致命错误信息
上面列出的就是所谓log4j的输出别,log4j只?个别,它们从上C分别为ERROR、WARN、INFO、DEBUGQ假设你定义的别是infoQ那么error和warn的日志可以显C比他低的debug信息׃昄了?
log4j.appender.appenderName = fully.qualified.name.of.appender.class。log4j提供了以下几U常用的输出目的圎ͼ(x)
org.apache.log4j.ConsoleAppenderQ将日志信息输出到控制台
org.apache.log4j.FileAppenderQ将日志信息输出C个文?BR>org.apache.log4j.DailyRollingFileAppenderQ将日志信息输出C个,q且每天输出C个新的日志文?BR>org.apache.log4j.RollingFileAppenderQ将日志信息输出C个文Ӟ通过指定文g的的寸Q当文g大小到达指定寸的时候会(x)自动把文件改名,如名为example.log的文件会(x)改名?example.log.1Q同时生一个新的example.log文g。如果新的文件再ơ达到指定尺寸,又会(x)自动把文件改名ؓ(f) example.log.2Q同时生一个example.log文g。依此类推,直到example.log. MaxBackupIndexQ?MaxBackupIndex的值可在配|文件中定义?BR>org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地斏V?BR>org.apache.log4j.jdbc.JDBCAppenderQ通过JDBC把日志信息输出到数据库中?BR>
Log4j提供了一下几U布局Q?BR>org.apache.log4j.HTMLLayoutQ以HTML表格形式布局
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串
定义一个PatternLayout布局的语句ؓ(f)Q?BR>log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1} - %m%n
PSQConversionPattern参数的格式含?BR>格式?含义
%c 输出日志信息所属的cȝ全名
%d 输出日志旉点的日期或时_(d)默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy-MM-dd HH:mm:ss }Q输出类|(x)2002-10-18- 22Q?0Q?8
%f 输出日志信息所属的cȝcd
%l 输出日志事g的发生位|,卌出日志信息的语句处于它所在的cȝW几?BR>%m 输出代码中指定的信息Q如log(message)中的message
%n 输出一个回车换行符QW(xu)indowsq_为“\r\n”,Unixq_为“\n?BR>%p 输出优先U,即DEBUGQINFOQW(xu)ARNQERRORQFATAL。如果是调用debug()输出的,则ؓ(f)DEBUGQ依此类?BR>%r 输出自应用启动到输出该日志信息所耗费的毫U数
%t 输出产生该日志事件的U程?BR>
另外很好的学?fn)笔讎ͼ?x)
http://www.sentom.net/list.asp?id=59
http://www.sentom.net/list.asp?id=60
http://www.sentom.net/list.asp?id=61
׃一个应用,我需要一个MD5法加密数据Q我查看了网上一些资料,发现其他的语a都是要自己实现的Q但是Java很单,因ؓ(f)java中的cdl处理好了,而且q可以选其他的加密法Q如SHAQ下面就l一个例?/p>
/*
* Created on 2005-5-21
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package com.merrylin.util;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/**
* @author Administrator
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class MD5Class {public static String MD5Encrypt(String inStr) {
MessageDigest md = null;
String outStr = null;try {
md = MessageDigest.getInstance("MD5"); //可以选中其他的算法如SHA
byte[] digest = md.digest(inStr.getBytes()); //q回的是byet[]Q要转化为String存储比较方便
outStr = bytetoString(digest);
} catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
}return outStr;
}public static String bytetoString(byte[] digest) {
String str = "";
String tempStr = "";for (int i = 1; i < digest.length; i++) {
tempStr = (Integer.toHexString(digest[i] & 0xff));
if (tempStr.length() == 1) {
str = str + "0" + tempStr;
} else {
str = str + tempStr;
}
}return str.toLowerCase();
}
}
单吧Q如果你只是要应用,可以不知道MD5的算法了Q但是要想知道更多,可以参看|上的源码或?a >http://www.donews.net/qiyadeng/archive/2005/05/26/399340.aspx。但是注意MD5加密法Q破解还是很困难Q虽然报道称׃大学的王云教授好像是已l寻扑ֈ了破解的Ҏ(gu)?/font>
<?xml version="1.0" encoding="UTF-8"?><!-- $Id: mysql-ds.xml,v 1.3.2.1 2004/12/01 11:46:00 schrouf Exp $ -->
<!-- Datasource config for MySQL using 3.0.9 available from:
http://www.mysql.com/downloads/api-jdbc-stable.html
--><datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>root</password>
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
<!-- sql to call when connection is created
<new-connection-sql>some arbitrary sql</new-connection-sql>
-->
<!-- sql to call on an existing pooled connection when it is obtained from pool
<check-valid-connection-sql>some arbitrary sql</check-valid-connection-sql>
--><!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml (optional) -->
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
<datasource>java:/MySqltDS</datasource>
<datasource-mapping>mySQL</datasource-mapping>
<datasource>java:/MySqltDS</datasource>
<type-mapping>mySQL</type-mapping>
<application-policy name = "MySqlDbRealm">
<authentication>
<login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule"
flag = "required">
<module-option name = "principal">test</module-option>
<module-option name = "userName">root</module-option>
<module-option name = "password">root</module-option>
<module-option name = "managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=MySqlDS</module-option>
</login-module>
</authentication>
</application-policy>
response.setContentType("text/html;charset=gb2312");
PrintWriter out = response.getWriter();
try {
// Put your code here
Context cx = new InitialContext();
Object obj = cx.lookup("java:/MySqlDS");
DataSource ds = (DataSource)obj;
Connection connect = ds.getConnection();
Statement stmt = connect.createStatement();
ResultSet rs = stmt.executeQuery("select * from customers");
while(rs.next()){
out.println(rs.getString("name"));
}
} catch (NamingException e) {
e.printStackTrace();
} catch(SQLException e1){
e1.printStackTrace();
}
out.flush();
out.close();
[root@localhost root]# native2ascii
你好世界!
\u4f60\u597d\u4e16\u754c!
一、在Servlet中读取:(x)
在Servlet中一般可以用ServletConfig对象的getInitParameterҎ(gu)去读取指定的参数的倹{D个例子:(x)
新徏一个ServletQReadInitParameter.java
q在web.xml中增加如下配|:(x)
<servlet>
<servlet-name>ReadInitParameter</servlet-name>
<servlet-class>com.test.ReadInitParameter</servlet-class>
<init-param>
<param-name>email</param-name>
<param-value>qiyadeng@haha.com</param-value>
</init-param>
<init-param>
<param-name>name</param-name>
<param-value>qiyadeng</param-value>
</init-param>
</servlet>
配置好了web.xmlQ现在可以在E序中读取初始化的参C。在init(ServletConfig config)Ҏ(gu)中传递了一个ServletConfig参数Q可以这栯取初始化参数Q?/p>
public void init(ServletConfig config) throws ServletException
{
super.init(config);
String email = config.getInitParameter("email");
String name = config.getInitParameter("name");
}
String email = getServletConfig().getInitParameter("email");
String name= getServletConfig().getInitParameter("name");
二、在JSP中读取:(x)
在JSP中读取的方式和Servlet中的doGet(),doPost(),Service()的方法一P都是由ServletConfig对象来读取的?/p>
<%
String zhutou = getServletConfig().getInitParameter("zhutou");
String zhutouname = getServletConfig().getInitParameter("zhutouname");
但是Q在web.xml的配|需要注意一?新增如下Q?/p>
<servlet>
<servlet-name>ReadInitParam</servlet-name>
<jsp-file>ReadInitParam.jsp</jsp-file>
<init-param>
<param-name>zhutou</param-name>
<param-value>zhutou@hotmail.com</param-value>
</init-param>
<init-param>
<param-name>zhutouname</param-name>
<param-value>zhutou</param-value>
</init-param>
</servlet>
在servlet-mapping中也要配|好Q?/p>
<servlet-mapping>
<servlet-name>ReadInitParam</servlet-name>
<url-pattern>ReadInitParam.jsp</url-pattern>
</servlet-mapping>
上面的ReadInitParam.jsp出现的标{N要jsp文g的全部\径?/p>
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
native2ascii -encoding gb2312 applicaion_CN.properties application_CN.properties
package com.yourcompany.struts;import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;public class SetCharacterEncodingFilter implements Filter {
public void init(FilterConfig arg0) throws ServletException {
}public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request,response);}
public void destroy() {
}}
<filter>
<filter-name>Character Encoding</filter-name>
<filter-class>com.yourcompany.struts.SetCharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>