JAVAWEB应用开发与实践第8章:Web应用开发常见问题梁胜彬乔保军主编清华大学出版社2清华大学出版社MVC与DAO模式本章要点:Java中文问题文件上传文件下载分页显示程序国际化安装与部署JavaWeb应用图表开发3清华大学出版社1.中文问题4清华大学出版社中文问题的根源Java的内核和中间字节码文件(.class)是基于Unicode编码方案的,这使得Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面:Java和JSP文件本身编译时产生的乱码问题和Java程序与其他媒介交互时产生的乱码问题。从JSP页面表单提交数据到Java程序(如Servlet)时,需要进行从字节到字符的转换;从Java程序到JSP页面显示时,需要进行从字符到字节的转换;从数据库到Java程序读取时,需要进行从字节到字符的转换;从Java程序到数据库存储时,需要进行从字符到字节的转换;从一些文件到Java程序读取时,需要进行从字节到字符的转换;从Java程序到一些文件存储时,需要进行从字符到字节的转换。1.中文问题5清华大学出版社了解常见的字符集:ASCIIISO-8859-1UnicodeUTF-8GB2312GBKGB18030BIG51.中文问题6清华大学出版社常见中文问题:JSP页面显示乱码的问题;表单提交中文时出现乱码的问题;数据库连接出现乱码的问题;数据库显示中文信息的乱码问题1.中文问题7清华大学出版社JSP页面显示乱码的问题导致这种乱码的原因是因为没有在JSP页面里指定使用的字符集编码。只要在JSP页面的page指令的contentType属性和pageEncodeing属性以及HTMLMETA标签的charset属性都指定使用“GBK”、“GB2312”、“GB18030”或者“UTF-8”任意一个字符集编码即可。1.中文问题8清华大学出版社表单提交中文时出现乱码的问题第一种方法是在获取表单数据的页面或Servlet中,首先使用request对象的setCharacterEncoding()方法强制设定获取表单数据的编码方式,如设置表单数据采用GBK字符编码集,则具体代码为:request.setCharacterEncoding(GBK);需要注意的是,使用这种方式时表单的method属性必须设定为“POST”方式,若为“GET”方式,那么这种处理表单中文问题的方法无效。第二种方式://假设页面参数名称为“name”Stringname=request.getParameter(name);name=newString(name.getBytes(ISO-8859-1),GB2312);1.中文问题9清华大学出版社数据库连接出现乱码的问题这种情况发生在程序向数据库中的保存含有中文信息的记录时变成乱码,或者在读取含有中文的记录时显示为乱码,解决方法为在数据库连接字符串中加入编码字符集,下面以MySQL数据库为例介绍问题的解决方法。StringUrl=jdbc:mysql://localhost:3306/database?user=root&password=root&useUnicode=true&characterEncoding=GB2312;1.中文问题数据库显示中文信息的乱码问题Java程序访问MySQL数据库中varchar、text等类型的字段时会出现中文乱码问题。纠其原因在于数据表中数据存储的编码方式与Java程序中数据的编码方案不同导致。解决方法是首先在设计数据库时,建议设置表的编码方案为GB2312或GBK等(MySQL默认为latin-1)。10清华大学出版社1.中文问题11清华大学出版社动手实践:新建一个表单form.jsp,提交表单后至info.jsp;在form.jsp提交的信息含有中文时,info.jsp能正常显示吗?假设把表单中的数据存储在数据库中,验证中文能否正常显示。目标:掌握JSP页面中文问题的解决方法;掌握数据库与程序之间中文问题的解决方法2.文件上传与下载文件上传与下载是Web应用中非常重要的一个应用之一,实现文件上传与下载的思路也很多,网上也提供了很多第三方组件,如jspSmartUpload。jspSmartUpload最早是由jspSmart开发的一个基于JSP的文件上传与下载组件,它具有以下优点。配置非常简单。用户只需要把下载的jspSmartUpload.jar文件放到JavaWeb项目的WEB-INF/lib目录下即可。对上传的文件具有很强的可控性。jspSmartUpload可以限制上传文件的扩展名、大小等。易获取上传文件的信息。使用jspSmartUpload自带的File类可以轻松地获取上传文件的信息,如文件名、文件大小、扩展名等。实现文件下载方便。jspSmartUpload同样提供了文件下载功能,仅需要几行代码就能实现文件的下载。12清华大学出版社2.文件上传与下载jspSmartUpload包中提供了五个类:File、Files、Request、SmartUpload和SmartUploadException。13清华大学出版社2.文件上传与下载File类14清华大学出版社方法说明voidsaveAs()该方法用于保存文件booleanisMissing()该方法用于判断用户是否选择了文件,即表单中对应的inputtype=“file”标签实现的文件选择域中是否有值,若选择了文件返回false,否则返回trueStringgetFieldName()获取表单中当前上传文件所对应的表单项的名称StringgetFileName()获取文件的文件名,该文件名不包含目录StringgetFilePathName()获取文件的文件全名,获取的值是一个包含目录的完整文件名StringgetFileExt()获取文件的扩展名,即后缀名,不包含“.”符号StringgetContentType()获取文件MIME类型,如“text/html”StringgetContentString()获取文件的内容intgetSize()获取文件的大小,单位byte2.文件上传与下载Files类15清华大学出版社方法说明intgetCount()取得上传文件的数目FilegetFile(intindex)取得指定位移处的文件对象,返回值为com.jspsmart.upload.File类型,参数index为指定位移,其值在0与getCount()-1之间longgetSize()取得上传文件的总长度,可用于限制一次性上传的数据量大小CollectiongetCollection()返回所有上传文件对象,以便其它应用程序引用,浏览上传文件信息EnumerationgetEnumeration()返回所有上传文件对象,以便其它应用程序浏览上传文件信息2.文件上传与下载Request类16清华大学出版社方法说明StringgetParameter(Stringname)获取表单中表单输入域为name的值EnumerationgetParameterNames()获取表单中除输入域为file类型外的所有表单元素的名称String[]getParameterValues(Stringname)获取表单中多个名称为name的表单输入域的字符串数组2.文件上传与下载SmartUpload类17清华大学出版社方法说明voidinitialize(PageContextpagecontext)初始化,使用SmartUpload对象时必须先调用方法,该方法进行了重载,此形式常用于JSP页面中voidinitialize(ServletConfigservletconfig,HttpServletRequesthttpservletrequest,HttpServletResponsehttpservletresponse)初始化,此种形式一般用于Servlet中voidinitialize(ServletContextservletcontext,HttpSessionhttpsession,HttpServletRequesthttpservletrequest,HttpServletResponsehttpservletresponse,JspWriterjspwriter)初始化,此种形式使用场合不多2.文件上传与下载SmartUpload类18清华大学出版社方法说明voidupload()上传文件数据。对于上传操作,第一步执行initialize方法,第二步就要执行这个方法intsave(Strings)将全部上传文件保存到指定目录s中intsave(Strings,intoption)上传文件保存至目录s中,option为保存选项,它有三个值,分别是SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下;SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下;而SAVE_AUTO则表示由组件自动选择。setDeniedFilesList(StringdeniedFilesList)该方法用于设置禁止上传的文件。其中参数deniedFilesList指定禁止上传文件的扩展名,多个扩展名之间以逗号分隔voidsetAllowedFilesList(StringallowedFilesList)设置允许上传的文件,用法类似于setDeniedFilesList()setMaxFileSize(longmaxFileSize)设定允许每个文件上传的最大长度setTotalMaxFileSize(longtotalMaxFileSize)设置允许上传文件的总长度2.文件上传与下载intgetSize()获取上传文件的总长度FilesgetFiles()获取全部上传文件RequestgetRequest()返回Request对象,通过该对象获得上传的表单中其他表单项的值voidsetContentDisposition(StringcontentDisposition)用于将数据追加到MIME文件头的CONTENT-DISPOSITION域。voiddownloadFile(Stringsource)文件下载,其中source为下载文件的文件名,可包含目录voiddownloadFile(Stringsource,StringcontentType)文件下载,其中contentType为文件内容类型(MIME格式的文件类型信息)voiddownloadFile(Stringsource,StringcontentType,Stringdest)文件下载,其中dest是下载的文件另存为的文件名voiddownloadFile(Stringsource,StringcontentType,Stringdest,intblockSize)文件下载,其中blockSize为存储读取的文件数据的字节数组的大小,默认值为6500019清华大学出版社2.文件上传与下载动手实践:使用jspSmartUpload组件完成新闻发布系统中新闻发布模块新闻附件的上传与下载功能。目标:掌握jspSmartUpload组件各类的用法;理解文件上传与下载的原理。学会设计具有上传功能的表单20清华大学出版社3.图表开发JFreeChartJFreeChart是一个Java开源项目,它是一款优秀的基于Java的图表开发组件,提供了在Java应用程序和JavaWeb应用程序下生成各种图表的功能,包括柱形图、饼形图、线图、区域图、时序图和多轴图等,这些图表可以JPEG、PNG等格式返回到应用程序中。部署安装jfreechart-1.0.13.jar和j