??xml version="1.0" encoding="utf-8" standalone="yes"?>
原web.xml头部:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN" "http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
<web-app>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
修改?
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
配置文g velocity.properties ? 如果?br />
resource.loader = file
file.resource.loader.description = Velocity File Resource Loader
file.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
file.resource.loader.path = .
file.resource.loader.cache = false
file.resource.loader.modificationCheckInterval = 2
q段, 全部注释掉即?
若没? 在配置里写上以上内? q更改第三项?br />
file.resource.loader.class = org.apache.velocity.tools.view.WebappResourceLoader
<servlet>
<servlet-name>velocity</servlet-name>
<servlet-class>org.apache.velocity.tools.view.servlet.VelocityLayoutServlet</servlet-class>
<init-param>
<param-name>org.apache.velocity.properties</param-name>
<param-value>/WEB-INF/config/velocity.properties</param-value>
</init-param>
<init-param>
<param-name>org.apache.velocity.toolbox</param-name>
<param-value>/WEB-INF/config/velocity-toolbox.xml</param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
2。在velocity.properties中配|日E相兛_?
#----------------------------------------------------------------------------
# default LogSystem to use: default: AvalonLogSystem
#----------------------------------------------------------------------------
runtime.log.logsystem.class = org.apache.velocity.runtime.log.SimpleLog4JLogSystem
runtime.log.logsystem.log4j.category = velocity_log
#----------------------------------------------------------------------------
# This controls if Runtime.error(), info() and warn() messages include the
# whole stack trace. The last property controls whether invalid references
# are logged.
#----------------------------------------------------------------------------
runtime.log.error.stacktrace = false
runtime.log.warn.stacktrace = false
runtime.log.info.stacktrace = false
runtime.log.invalid.reference = true
3\ 配置log4j.properties, 具体配置意义请参看log4j配置相关文档
log4j.rootLogger=INFO,CONSOLE,FILE
log4j.logger.velocity_log=INFO,CONSOLE,VELOCITY
log4j.addivity.org.apache=true
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.Threshold=WARN
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.Encoding=GBK
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%-4p] %d{MM-dd HH:mm} - %m %n
log4j.appender.VELOCITY=org.apache.log4j.FileAppender
log4j.appender.VELOCITY.File=E:/workspace/dwrt/WebRoot/log/velocity.log
log4j.appender.VELOCITY.Append=false
log4j.appender.VELOCITY.Encoding=GBK
log4j.appender.VELOCITY.layout=org.apache.log4j.PatternLayout
log4j.appender.VELOCITY.layout.ConversionPattern=[%-4p] %d{MM-dd HH:mm} - %m %n
SELECT COUNT(*) FROM table t WHERE t.col NOT IN
(select t.col from table t WHERE t.col= '3')
以上两句SQL的执行结果不? 因ؓ <> 在排?的同? null也排除了,
所以当比较字段含null?W一句将比第二句的结果少.
当然W二句从效率上来说不是一个好的写? q样写只是ؓ了理? 在第一句后? 加上 or t.col is null 应该q效了.
提示Q?br />
/j_spring_security_check是Spring Security默认的进行表单验证的qo地址Q你也可以修改ؓ别的名称Q但是需要和
applicationContext-security.xml中相对应Q当然还会涉及到其它一些默认|可能是一个成员变量,也可能是别的?br />
求地址Q,在下文我们将看到Q徏议你在阅L文的同时Q应该参照Spring Security目的源代码Q便于你更好的理解?/td>
3 配置a(chn)pplicationContext-security.xml
3.1 FilterChainProxyqo器链
FilterChainProxy会按序来调用一lfilterQɘq些filter卌完成验证授权的本质工作,又能享用Spring Ioc的功能来方便的得到其它依赖的资源。FilterChainProxy配置如下Q?/p>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON 定义URL在匹配之前必d转ؓ写QPATTERN_TYPE_APACHE_ANT 定义了用Apache ant的匹配模式,/**定义的将{号后面的过滤器应用在那些URL上,q里使用全部URLqoQ每个过滤器之间都适用逗号分隔Q它们按照一定的序排列?/p>
提示Q?
特别需要注意的是,即你配|了pȝ提供的所有过滤器Q这个过滤器链会很长Q但是千万不要用换行,否则它们不会正常工作Q?br />
容器甚至不能正常启动?/td>
下面Ҏ(gu)FilterChainProxy的配|来介绍各个qo器的配置Q各个过滤器的执行顺序如以上配置?/p>
首先是通道处理qo器,如果你需要用HTTPSQ这里我们就使用HTTPq行传输Q所以不需要配|通道处理qo器,然后是集成过滤器Q配|如下:
httpSessionContextIntegrationFilter是集成过滤器的一个实玎ͼ在用L一个请求过E中Q用L认证信息通过SecurityContextHolderQ用ThreadLoacl实现Q进行传递的Q所有的qo器都是通过SecurityContextHolder来获取用L认证信息Q从而在一ơ请求中所有过滤器都能׃nAuthenticationQ认证)Q减了HttpRequest参数的传送,下面的代码是从安全上下文的获取Authentication对象的方法:
但是QThreadLoacl不能跨越多个h存在Q所以,集成qo器在h开始时从Http会话中取出用戯证信息ƈ创徏一个SecurityContextHolderAuthentication对象保存在其中,在请求结束之后,在从SecurityContextHolder中获取Authentication对象q将其放回Http会话中,׃ơ请求用,从而达C跨越多个h的目的。集成过滤器q有其它的实玎ͼ可以参考相x档?/p>
提示Q?br /> 集成qo器必d其它qo器之前被使用?/td> |
logoutFilterQ退滤器Q?Q退出登录操作:
在这一个多月的目实训q程Q我感到是我专业学习中收获非常大的一个月。在q个月里Q我体验C团队合作的经验,~程q程中的乐趣Q以及将学习应用到实际、从实践中学习的丰收感?/span>
q一个月里,得到了二个最宝贵体验Q一是参与了一个团队合作的、有很强多同模块怺性、和一套完整生命周期流E的工程目。这一套项目按照Y件工E的程一步步C来,l历了需求分析,详细设计Q实际编码和试q一pd阶段。一步一步慢慢的C来。虽然对于真实的目来说Q这个项目的复杂度和规模q不是很大,逻辑要求也不是太严格。但是对于只参加一?/span>3-4人的目~程的我来说Q已l第一ơ让我体真正的体验到编E作Z工E来执行的难得经验?/span>
W二个体验是详细设计中,Y件架构和分层的思想以及单的工程模式{应用到了项目中。用框架等方式Q非常有效的提高了代码的复用和工E的可维护性,虽然多层l构看似ȝQ但实际上它很大的降低了设计的复杂度Q在实际的体验中感到Q用了框架后的模块Q维护v来清C很多Q容易了很多Q降低了耦合Q同时增Z模块间的交互和重用?/span>
随着整个工程的流E一步步q行Q我们看C一个工E的一ơ次成长。项目伊始,我们得到了项目需求文档(我想q一步在实际中也应该是由目人员_ֿ设计才完成的Q,对于工程的不同用例,工E分Z六个模块Qƈ对应的将l员分ؓ了六l。我们的W一步是完成寚w求文档的理解Q而成果就是对应了各个模块的实际功能的静态页面,因ؓ软g客户最后体验所有需求的功能实现是通过操作面来实玎ͼ所以页面要在客户需求的角度去考虑Q同时要需求的功能都赋予体现?/span>在这个过E中Q大安了按功能分化出页面分cdQ大部分旉q用来精心设计页面的风格。页面布局和菜单中大量用到?/span>JavaScript?/span>CSS。和以我往设计面时不同的是,Z让大家可以公用这些设计,在页面的布局中不能太复杂Q甚臛_乎是不能在需要统一的地面对整体的布|有M复杂的干预。所有希望统一的部?/span>都要在公qCSS?/span>JavaScript中做出方便统一使用的类或方法,在页面本w的代码中几乎看不到布局设计Q只有功能组件?/span>
在页面设计通过审核之后是详细设计阶段了,在这阶段的前几天我们犯了一个顺序错误,直接从数据库着手。结果由于项目的功能的复杂性和模块之间太多需要交互的地方Q得数据库的设计进行的很缓慢。经q老师的提Ҏ(gu)们改ZE序~码的框架开始着手。联pd功能的具体实现来设计~码的层ơ结构(框架详细设计在下一节)Q划分出公共q_。这样再从各模块的功能及其交互划分来联系设计数据库就变的清晰了很多。在设计q程中我们还使用?/span>E-R图来设计出关pL据库Q即从参与的对象和对象之间的关系最l设计出数据库的Ҏ(gu)。在q次设计中发现自己在利用一些系l的理论q行整体的数据库模型设计斚wq存在很多不뀂数据库完成后,Ҏ(gu)架的设计也基本完成,公共的分设计,数据库连接与关闭Q工E的文gl构和工E的环境也在几次讨论后完成统一设计?/span>
׃之前?/span>struts有了一定的了解Q所以我在需求分析阶D就开始尝试着着手对几个单模块的实现~码Q之后在详细设计阶段中,每次讨论后新加的内容都需要对已经完成的代码进行一ơ大的修攏V随着代码的增长,试了很多种文gl构。之后引入项目的框架也经历了很大的修改和许多ơ的试。此外的修改q包?/span>BaseAction的引入,DispatchAction的引入,使用struts异常处理{,q做好工E备份及修改记录在日报中。在q一ơ次的修改中让我受益匪浅Q对q些设计和修Ҏ(gu)了更深刻的体会。这样在详细设计阶段的过E中Q框架设计都已经在编码中事先q行了实现和试Q一些功能在写好后被分离出来作ؓ公共q_。终于在组开始编码时定Zl一q详l完整的的工E的全部环境Q项目的框架l构和整体编码方式。我的编码实现和单元试也基本完成?/span>
在两周的~码q程中,我主要是和吉利一起协助各模块~码Q增加各模块间交,在这期间也解决问题的q程中学到知识。经q全体组员两周的努力工作Q终于进入了试阶段。我和吉利负责整体测试,试联结了所有模块之后,可以利的完成全套的程。让整个设计可以?/span>6个流E中一步步的走下去Q同时保证数据库中所有数据和状态的正确性。随着试一ơ次的进行,问题渐渐被全部排除,l过3ơ测试之后,基本可以完全利的走完全套流E?/span>
我们q次工程中用的是四层结构的框架Q即?/span>MVC三层l构的同Ӟ?/span>model模型层分成了model模型层和DAO持久层。其中又Ҏ(gu)工厂模式分出DAO接口Q?/span>beanQ?/span>factoryQ?/span>serviceQ?/span>managerQ提?/span>DAO实现?/span>
l构实现Q首先我们根据框Ӟ设计出相应的文gl构。视囑ֱx?/span>JSP文gQ和配置文g一Leclipse的自动生成单独分?/span>WebRoot下,六模块的面分别分于六个子目录下。所有的公共面?/span>jsQ?/span>css目录也放?/span>WebRoot下。由于这ơ项目中模块间的功能面基本是完全相互独立的Q这为在实现视图层和控制层之间的面跌{控制带来很大的方ѝ代码目录(srcQ下为六个模块的六个目录Q公׃码目录(platformQ,以及后加入的验证模块的目录(validateQ。除公共目录外,各模块下代码分ؓ5个目录:ActionQ?/span>modelQ?/span>FormQ?/span>manager?/span>dao。(q里有两个命名的pQ根据实际的使用Q?/span>model的名字应该叫bean更合适,而这?/span>manager一般在框架中称?/span>service。但我们已经有了UCؓservice的模块名U。)q里?/span>Action?/span>Form对应?/span>struts中的lgQ?/span>DAO层和model-bean一起完成了操作的具体实玎ͼ
视图?/span>viewQM框架上,我们使用的是frameset来实玎ͼ不过听老师说现在流行的使用jap?/span>includel合div{来实现面框架。在之后~码中,因ؓframeset出现了一个问题,是用来验证拦截的过滤器无法h整个框架Q得拦截后的页面只能显C在被操作的frame中。但?/span>frameset的好处是框架分离的很好,在实?/span>jsp~码中几乎完全不用去考虑框架。我不知道用include是否能做到。以前虽焉使用?/span>includeQ但是是在每个页面中都要加入include。有时还会媄响布局。在~码q程中,我们?/span>JavaScript实现了很多很好用的效果,比如选择旉的窗口,表单的正则表辑ּ验证Q表格的变色效果{,装到公qjs文g中,调用h很方ѝ在q次jap~程中,我终于由最初的在页面中堆满java代码Q{变ؓ只用一?/span>JSTLQ?/span>EL语句?/span>struts标签处理逻辑Q美观了面~码Q同时让面更专注于昄层。但q里我对EL语句和纯标签语句又有些难以取舍?/span>EL语句在页面代码中虽然不如单用标签昑־Ua观Q但?/span>EL表达式简U的表现风格让实现和l护变得Ҏ(gu)了很多?/span>
控制?/span>Action的设计一是用了DispatchActionQ将多个ActioncdqӞ方便了管理。二在公共部分中定义?/span>BaseActionQ由q个cdl承struts?/span>DispatchAction。之后我们的所?/span>Action都去l承q个BaseAction。这样在需要对Actionq行l一处理Q以及定义一些供Action公共使用的方法时可以在q个BaseAction中修攏V虽然在q次目中,BaseAction只定义了个用于处理字Wؕ码的Ҏ(gu)公共使用Q但由此卛_瞥见对于更复杂的Actionl一处理q种设计也能从容应对。由于是分模块进行,于是我们?/span>struts?/span>xml配置文g也分为对应各个模块,使用?/span>xml的配|方式,而这也需要对命名规则{很多方面有更好的协调和l一。在q次控制层的实现中,我v初还是像以前一样对很多不同的验证,模型层返回的异常都在Action中处理ƈ跌{。在之后的修改中Q逐渐这些处理都改至模型?/span>Manager中,?/span>Manager取用持久层的操作Ҏ(gu)Q实现所有业务逻辑处理?/span>
具体实现功能的模型层中,我们为每?/span>DAO定义了接口和实现c,q也是我W一ơ将接口真正应用到程序中。同时我们在每个模块?/span>DAO中应用了工厂模式Q由一?/span>factorycd现所?/span>DAO的单例生成。之后在Manager中调用这个实例实现操作。而这?/span>Manager同时本n也是单例实现的,?/span>Actionq行静态调用。可见其中实?/span>Action控制层和DAO持久层交互的是Manager模型层,q将两者严格的分离开来。同时在Manager中还集合处理了所有来至业务功能逻辑和底部数据库的所有异常。因为数据库的连接也是在Manager中创建的Q但q不影响持久层的独立性,因ؓq是考虑?/span>有时一ơ业务操作会q行多个数据库操作、调用多个数据库Ҏ(gu)Q将q接在模型层中创建更便于数据库的高效使用。模型层中对异常的集中处理,更简化了上下控制层和模型层的实现Q其更专注于各自的业务实现。在异常处理上,使用?/span>struts的一U异常处理机Ӟ?/span>xml配置文g中进行异帔R|。这样在Manager中将异常抛出Q由struts实现异常跌{和提C。同时我们还自定义的异常处理类也作为公q公用Q这样就可以在需要的时候对异常q行l一的处理?/span>
在持久层的实CQ我们用了tomcat数据库连接池Q在~码中将数据库连接等Ҏ(gu)装到公q中,q且连接数据源作静态单例实玎ͼ以提高数据库调用的效率。在DAO的设计方面,我们主要针对实际的操作对象和对应的数据库q行DAO层方法的装。每个方法尽量实C些简单的操作。这样在不同模块直接有数据和操作交互的时候,只在模型层只要去各个模块?/span>DAO中取得需要的Ҏ(gu)加以l合Q实现自q业务处理。很好的提高了代码的复用性和可维护性,降低了各个模块间数据交互处理的设计复杂度?/span>
//文采太烂Q?nbsp;l尾的感慨段׃发了
Q?Q前aQ?br /> 解决webE序的国际化问题Q必dM地方使用UTF-8对字W进行编码。(包括Q数据库讄为:UTF-8Qweb面也要讄为:UTF-8Q?br /> q样做的好处在于可以解决在web上不止中文字W编码问题,所有的字符~码都统一使用UTF-8,实现了语a的国际化。同时在保存数据?br /> 数据库时候也省去了编码{换的问题?br /> 在JSP或JSF应用中用到ServletQ我们通过使用Servletqo器进行编码{换,也就是制定编码{换ؓUFT-8?/p>
Q?QServlet和JSPqo器Filter介:
servlet API?.3版本中最重要的一个新功能是能够为servlet和JSP面定义qo器。过滤器提供了某些早期服务器所支持的非标准“servlet链接”的一U功能强大且标准的替代品?br />
qo器是一个程序,它先于与之相关的servlet或JSP面q行在服务器上。过滤器可附加到一个或多个servlet或JSP面上,q且可以查进入这些资源的h信息。在q之后,qo器可以作如下的选择Q?br />
- 以常规的方式调用资源Q即Q调用servlet或JSP面Q?br />
- 利用修改q的h信息调用资源?br />
- 调用资源Q但在发送响应到客户机前对其q行修改
- L该资源调用,代之以{到其他的资源Q返回一个特定的状态代码或生成替换输出?br />
qo器提供了几个重要好处?br />
首先Q它以一U模块化的或可重用的方式装公共的行为。你?0个不同的serlvet或JSP面Q需要压~它们的内容以减下载时间吗Q没问题Q构造一个压~过滤器Q参阅第11节)Q然后将它应用到30个资源上卛_?br />
其次Q利用它能够高U访问决{与表现代码相分R这对于JSP特别有h(hun)|其中一般希望将几乎整个面集中在表CQ而不是集中在业务逻辑上。例如,希望d来自某些站点的访问而不用修改各面Q这些页面受到访问限Ӟ吗?没问题:建立一个访问限制过滤器Q参阅第8节)q把它应用到惌限制讉K的页面上卛_?br />
最后,qo器你能够对许多不同的资源进行批量性的更改。你有许多现存资源,q些资源除了公司名要更改外其他的保持不变Q能办到么?没问题:构造一个串替换qo器(参阅W?0节)Q只要合适就使用它?br />
但要注意Q过滤器只在与servlet规范2.3版兼容的服务器上有作用。如果你的Web应用需要支持旧版服务器Q就不能使用qo器?br />
建立一个过滤器涉及下列五个步骤Q?br />
1、徏立一个实现Filter接口的类。这个类需要三个方法,分别是:doFilter、init和destroy。doFilterҎ(gu)包含主要的过滤代码,initҎ(gu)建立讄操作Q而destroyҎ(gu)q行清楚?br />
2、在doFilterҎ(gu)中放入过滤行为。doFilterҎ(gu)的第一个参CؓServletRequest对象。此对象l过滤器提供了对q入的信息(包括表单数据、cookie和HTTPh_的完全访问。第二个参数为ServletResponseQ通常在简单的qo器中忽略此参数。最后一个参CؓFilterChainQ如下一步所qͼ此参数用来调用servlet或JSPc?br />
3、调用FilterChain对象的doFilterҎ(gu)。Filter接口的doFilterҎ(gu)取一个FilterChain对象作ؓ它的一个参数。在调用此对象的doFilterҎ(gu)ӞȀzM一个相关的qo器。如果没有另一个过滤器与servlet或JSP面兌Q则servlet或JSP面被激zR?br />
4、对相应的servlet和JSP面注册qo器。在部v描述W文Ӟweb.xmlQ中使用filter和filter-mapping元素?br />
5、禁用激zdservlet。防止用户利用缺省servlet URLl过qo器设|?br />
doFilterҎ(gu)Q?/p>
在web.xml中进行部|?br />
分别是:filter和filter-mapping。filter元素向系l注册一个过滤对象,filter-mapping元素指定该过滤对象所应用的URL?/p>
1.filter元素
filter元素位于部v描述W文Ӟweb.xmlQ的前部Q所有filter-mapping、servlet或servlet-mapping元素之前。filter元素h如下六个可能的子元素Q?br />
:icon q是一个可选的元素Q它声明IDE能够使用的一个图象文件?br />
: filter-name q是一个必需的元素,它给qo器分配一个选定的名字?br />
: display-name q是一个可选的元素Q它l出IDE使用的短名称?br />
: description q也是一个可选的元素Q它l出IDE的信息,提供文本文档?br />
: filter-class q是一个必需的元素,它指定过滤器实现cȝ完全限定名?br />
: init-param q是一个可选的元素Q它定义可利用FilterConfig的getInitParameterҎ(gu)d的初始化参数。单个过滤器元素可包含多个init-param元素?br />
2.filter-mapping元素
filter-mapping元素位于web.xml文g中filter元素之后serlvet元素之前。它包含如下三个可能的子元素Q:
filter-name q个必需的元素必M用filter元素声明时给予过滤器的名U相匚w?br />
url-pattern 此元素声明一个以斜杠Q?Q开始的模式Q它指定qo器应用的URL。所有filter-mapping元素中必L供url-pattern或servlet-name。但不能对单个filter-mapping元素提供多个url-pattern元素V如果希望过滤器适用于多个模式,可重复整个filter-mapping元素?br />
:servlet-name 此元素给Z个名Uͼ此名U必M利用servlet元素l予servlet或JSP面的名U相匚w。不能给单个filter-mapping元素提供多个servlet-name元素V如果希望过滤器适合于多个servlet名,可重复这个filter-mapping元素?/p>
Q?Q在Rational Application Developer 中的建立字符转换qo器:
1.新徏-web-qo器:SetCharacterEncodingFilter
会在web.xml中生如上代码:
2.在过滤器的doFilterҎ(gu)中添加如下代码:
3.在web.xml中进行部|?br />
在web.xml的过滤器-~辑器中选择Qservlet 映射 - d - Faces Servlet
会在web.xml中生如下代码:
<filter-mapping>
<filter-name>SetCharacterEncodingFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
Q?Q其他参考信?br />
tomcat下中文的d解决
(一) JSP面上是中文Q但是看的是后是qQ?br />
解决的办法就是在JSP面的编码的地方<%@ page language="java" contentType="text/html;charset=GBK" %>Q因为Jsp转成Java文g时的~码问题Q默认的话有的服务器是ISO-8859-1Q如果一个JSP中直接输入了中文QJsp把它当作ISO8859-1来处理是肯定有问题的Q这一点,我们可以通过查看Jasper所生成的Java中间文g来确?br />
(? 当用Request对象获取客户提交的汉字代码的时候,会出Cؕ码:
解决的办法是Q要配置一个filter,也就是一个Servelet的过滤器Q代码如下:
配置web.xml
如果你的q是出现q种情况的话你就往下看看是不是你出CW四中情况,你的Form提交的数据是不是用get提交的,一般来说用post提交的话是没有问题的Q如果是的话Q你q看第四中解决的办法?br />
q有是对含有汉字字W的信息q行处理Q处理的代码是:
package dbJavaBean;
public class CodingConvert
{
public CodingConvert()
{
//
}
public String toGb(String uniStr){
String gbStr = "";
if(uniStr == null){
uniStr = "";
}
try{
byte[] tempByte = uniStr.getBytes("ISO8859_1");
gbStr = new String(tempByte,"GB2312");
}
catch(Exception ex){
}
return gbStr;
}
public String toUni(String gbStr){
String uniStr = "";
if(gbStr == null){
gbStr = "";
}
try{
byte[] tempByte = gbStr.getBytes("GB2312");
uniStr = new String(tempByte,"ISO8859_1");
}catch(Exception ex){
}
return uniStr;
}
}
你也可以在直接的转换Q首先你获取的字符串用ISO-8859-1q行~码Q然后将q个~码存放C个字节数l中Q然后将q个数组转化成字W串对象可以了Q例如:
String str=request.getParameter(“girl”);
Byte B[]=str.getBytes(“ISO-8859-1”);
Str=new String(B);
通过上述转换的话Q提交的M信息都能正确的显C?br />
(? 在Formgeth在服务端用request. getParameter(“name”)时返回的是ؕ码;按tomcat的做法设|Filter也没有用或者用request.setCharacterEncoding("GBK");也不用问题是出在处理参C递的Ҏ(gu)上:如果在servlet中用doGet(HttpServletRequest request, HttpServletResponse response)Ҏ(gu)q行处理的话前面即是写了:
request.setCharacterEncoding("GBK");
response.setContentType("text/html;charset=GBK");
也是不v作用的,q回的中文还是ؕ码!Q!如果把这个函数改成doPost(HttpServletRequest request, HttpServletResponse response)一切就O(jin)K了?br />
同样Q在用两个JSP面处理表单输入之所以能昄中文是因为用的是postҎ(gu)传递的Q改成getҎ(gu)依旧不行?br />
由此可见在servlet中用doGet()Ҏ(gu)或是在JSP中用getҎ(gu)q行处理要注意。这毕竟涉及到要通过览器传递参C息,很有可能引v常用字符集的冲突或是不匹配?br />
解决的办法是Q?br />
1) 打开tomcat的server.xml文gQ找到区块,加入如下一行:
URIEncoding=”GBK”
完整的应如下Q?
<Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" redirectPort="8443" acceptCount="100" debug="0" connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>
2)重启tomcat,一切OK?br />
需要加入的原因大家可以ȝI?$TOMCAT_HOME/webapps/tomcat-docs/config/http.html下的q个文g可以知道原因了。需要注意的是:q个地方如果你要是用UTF-8的时候在传递的q程中在Tomcat中也是要出现q的情况,如果不行的话换别的字符集?br />
(? JSP面上有中文Q按钮上面也有中文,但是通过服务器查看页面的时候出Cؕ码:
解决的办法是Q首先在JSP文g中不应该直接包含本地化的消息文本Q而是应该通过<bean:message>标签从Resource Bundle中获得文本。应该把你的中文文本攑ֈApplication.properties文g中,q个文g攑֜WEB-INF/classes/*下,例如我在面里有姓名Q年龄两个label,我首先就是要Z个Application.propertiesQ里面的内容应该是name=”姓名” age=”q龄”,然后我把q个文g攑ֈWEB-INF/classes/properties/下,接下来根据Application.properties文gQ对他进行编码{化,创徏一个中文资源文Ӟ假定名字是Application_cn.properties。在JDK中提供了native2ascii命oQ他能够实现字符~码的{换。在DOS环境中找C攄Application.properties的这个文件的目录Q在DOS环境中执行一下命令,生成按GBK~码的中文资源文件Application_cn.propertiesQnative2ascii ?encoding gbk Application.properties Application_cn.properties执行以上命o以后生成如下内容的Application_cn.properties文gQname=\u59d3\u540d age=\u5e74\u9f84,在Struts-config.xml中配|:<message-resources parameter="properties.Application_cn"/>。到q一步,基本上完成了一大半Q接着你就要在JSP面上写<%@ page language="java" contentType="text/html;charset=GBK" %>,到名字的那个label是要?lt;bean:message key=”name”>,q样的化在页面上出现的时候就会出C文的姓名Q年龄这个也是一P按钮上汉字的处理也是同样的?br />
(? 写入到数据库是ؕ码:
解决的方法:要配|一个filter,也就是一个Servelet的过滤器Q代码如同第二种时候一栗?br />
如果你是通过JDBC直接链接数据库的时候,配置的代码如下:jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBKQ这样保证到数据库中的代码是不是q?br />
如果你是通过数据源链接的化你不能按照q样的写法了Q首先你p写在配置文g中,在tomcat 5.0.19中配|数据源的地Ҏ(gu)在C:\Tomcat 5.0\conf\Catalina\localhostq个下面Q我建立的工E是workshopQ放|的目录是webapp下面,workshop.xml的配|文件如下:
<!-- insert this Context element into server.xml -->
<Context path="/workshop" docBase="workshop" debug="0"
reloadable="true" >
<Resource name="jdbc/WorkshopDB"
auth="Container"
type="javax.sql.DataSource" />
<ResourceParams name="jdbc/WorkshopDB">
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>
maxActive</name>
<value>100</value>
</parameter>
<parameter>
<name>maxIdle</name>
<value>30</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>10000</value>
</parameter>
<parameter>
<name>username</name>
<value>root</value>
</parameter>
<parameter>
<name>password</name>
<value></value>
</parameter>
<!-- Class name for mm.mysql JDBC driver -->
<parameter>
<name>driverClassName</name>
<value>com.mysql.jdbc.Driver</value>
</parameter>
<parameter>
<name>url</name>
<value><![CDATA[jdbc:mysql://localhost:3306/workshopdb?useUnicode=true&characterEncoding=GBK]]></value>
</parameter>
</ResourceParams>
</Context>
_体的地方要特别的注意,和JDBC直接链接的时候是有区别的Q如果你是配|正的化,当你输入中文的时候到数据库中是中文了,有一点要注意的是你在昄数据的页面也是要?lt;%@ page language="java" contentType="text/html;charset=GBK" %>q行代码的。需要注意的是有的前台的人员在写代码的是后用Dreamver写的Q写了一个Form的时候把他改成了一个jspQ这h一个地方要注意了,那就是在Dreamver中Action的提交方式是request的,你需要把他该q来Q因为在jsp的提交的q程中紧紧就是POST和GET两种方式Q但是这两种方式提交的代码在~码斚wq是有很大不同的Q这个在后面的地方进行说?
文章出处Qhttp://www.diybl.com/course/3_program/java/javajs/200829/99730_3.html