本书章节来自:JAVA WEB 应用与开发 梁胜彬 乔保军主编 清华大学出版社
上一章节:JSP——第7章: MVC与DAO模式
Web应用开发常见问题
本章要点: Java中文问题 文件上传 文件下载 分页显示 程序国际化 安装与部署Java Web应用 图表开发1.中文问题
中文问题的根源 Java的内核和中间字节码文件( .class)是基于Unicode编码方案的,这使得Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面: Java和JSP文件本身编译时产生的乱码问题和Java程序与其他媒介交互时产生的乱码问题。 @ 从JSP页面表单提交数据到Java程序(如Servlet)时,需进行从字节到字符转换; @ 从Java程序到JSP页面显示时,需要进行从字符到字节的转换; @ 从数据库到Java程序读取时,需要进行从字节到字符的转换; @ 从Java程序到数据库存储时,需要进行从字符到字节的转换; @ 从一些文件到Java程序读取时,需要进行从字节到字符的转换; @ 从Java程序到一些文件存储时,需要进行从字符到字节的转换。
常见的字符集:ASCII,ISO-8859-1,Unicode ,UTF-8,GB2312,GBK,GB18030,BIG5
常见中文问题: @ JSP页面显示乱码的问题; @ 表单提交中文时出现乱码的问题; @ 数据库连接出现乱码的问题; @ 数据库显示中文信息的乱码问题
JSP页面显示乱码的问题
导致这种乱码的原因是因为没有在JSP页面里指定使用的字符集编码。只要在JSP页面的page指令的contentType属性和pageEncodeing属性以及HTMLMETA标签的charset属性都指定使用“GBK”、“GB2312”、“GB18030”或者“UTF-8”任意一个字符集编码即可。
表单提交中文时出现乱码的问题
第一种方法是在获取表单数据的页面或Servlet中,首先使用request对象的setCharacterEncoding()方法强制设定获取表单数据的编码方式,如设置表单数据采用GBK字符编码集,则具体代码为:request.setCharacterEncoding("GBK");需要注意的是,使用这种方式时表单的method属性必须设定为“ POST”方式,若为“ GET”方式,那么这种处理表单中文问题的方法无效。 第二种方式://假设页面参数名称为“ name” String name = request.getParameter("name"); name = new String(name.getBytes("ISO-8859-1"),"GB2312"); 数据库连接出现乱码的问题这种情况发生在程序向数据库中的保存含有中文信息的记录时变成乱码,或者在读取含有中文的记录时显示为乱码,解决方法为在数据库连接字符串中加入编码字符集,下面以MySQL数据库为例介绍问题的解决方法。
String Url="jdbc:mysql://localhost:3306/database?user=root
&password=root&useUnicode=true&characterEncoding=GB2312";
数据库显示中文信息的乱码问题
Java程序访问MySQL数据库中varchar、 text等类型的字段时会出现中文乱码问题。 纠其原因在于数据表中数据存储的编码方式与Java程序中数据的编码方案不同导致。解决方法是首先在设计数据库时,建议设置表的编码方案为GB2312或GBK等( MySQL默认为latin-1)。
动手实践: 新建一个表单form.jsp,提交表单后至info.jsp;在form.jsp提交的信息含有中文时,info.jsp能正常显示吗? 假设把表单中的数据存储在数据库中,验证中文能否正常显示。 目标: 掌握JSP页面中文问题的解决方法; 掌握数据库与程序之间中文问题的解决方法 2.文件上传与下载
文件上传与下载是Web应用中非常重要的一个应用之一,实现文件上传与下载的思路也很多,网上也提供了很多第三方组件,如jspSmartUpload。jspSmartUpload最早是由jspSmart开发的一个基于JSP的文件上传与下载组件,它具有以下优点。 @ 配置非常简单。用户只需要把下载的jspSmartUpload.jar文件放到Java Web项目的WEBINF/lib目录下即可。 @ 对上传的文件具有很强的可控性。 jspSmartUpload可以限制上传文件的扩展名、大小等。 @ 易获取上传文件的信息。使用jspSmartUpload自带的File类可以轻松地获取上传文件的信息,如文件名、文件大小、扩展名等。 @ 实现文件下载方便。 jspSmartUpload同样提供了文件下载功能,仅需要几行代码就能实现文件的下载。 jspSmartUpload包中提供了五个类: File、 Files、Request、 SmartUpload和SmartUploadException。File类 方法 说明 @ void saveAs() 该方法用于保存文件 @ boolean isMissing() 该方法用于判断用户是否选择了文件, 即表单中对应的<input type=“file”>标签实现的文件选择域中是否有值, 若选择了文件返回false, 否则返回true
@ String getFieldName() 获取表单中当前上传文件所对应的表单项的名称 @ String getFileName() 获取文件的文件名, 该文件名不包含目录 @ String getFilePathName() 获取文件的文件全名, 获取的值是一个包含目录的完整文件名 @ String getFileExt() 获取文件的扩展名,即后缀名,不包含“ .”符号 @ String getContentType() 获取文件MIME类型, 如“ text/html” @ String getContentString() 获取文件的内容 @ int getSize() 获取文件的大小, 单位byte @ int getCount() 取得上传文件的数目 @ File getFile(int index) 取得指定位移处的文件对象, 返回值为com.jspsmart.upload.File类型,参数index为指定位移, 其值在0与getCount()-1之间 @ long getSize() 取得上传文件的总长度, 可用于限制一次性上传的数据量大小 @ Collection getCollection() 返回所有上传文件对象, 以便其它应用程序引用, 浏览上传文件信息 @ Enumeration getEnumeration() 返回所有上传文件对象, 以便其它应用程序浏览上传文件信息
Request类
@ String getParameter(String name) 获取表单中表单输入域为name的值 @ Enumeration getParameterNames() 获取表单中除输入域为file类型外的所有表单元素的名称 @ String[]getParameterValues(String name) 获取表单中多个名称为name的表单输入域的字符串数组 SmartUpload类 @ void initialize(PageContext pagecontext) 初始化, 使用SmartUpload对象时必须先调方法, 该方法进行了重载, 此形式常用JSP页面中 @ void initialize(ServletConfig servletconfig,HttpServletRequest httpservletrequest,HttpServletResponse httpservletresponse) 初始化, 此种形式一般用于Servlet中 @ void initialize(ServletContextservletcontext, HttpSession httpsession,HttpServletRequest httpservletrequest,HttpServletResponse httpservletresponse,JspWriter jspwriter) 初始化,使用不多
@ void upload() 上传文件数据。 对于上传操作, 第一步执行initialize方法, 第二步就要执行这个方法 @ int save(String s) 将全部上传文件保存到指定目录s中 @ int save(String s, int option) 上传文件保存至目录s中,option为保存选项,它有三个值,分别为SAVE_PHYSICAL,SAVE_VIRTUAL和SAVE_AUTO。SAVE_PHYSICAL指示组件将文件保存到以操作系统根目录为文件根目录的目录下;SAVE_VIRTUAL指示组件将文件保存到以Web应用程序根目录为文件根目录的目录下;而SAVE_AUTO则表示由组件自动选择。 @ set DeniedFilesList(String deniedFilesList) 该方法用于设置禁止上传的文件。 参数deniedFilesList指定禁止上传文件的扩展名, 多个扩展名之间以逗号分隔 @ void setAllowedFilesList(String allowedFilesList)设置允许上传的文件, 用法类似于setDeniedFilesList() @ setMaxFileSize(long maxFileSize) 设定允许每个文件上传的最大长度 @ setTotalMaxFileSize(long totalMaxFileSize) 设置允许上传文件的总长度
@ int getSize() 获取上传文件的总长度 @ Files getFiles() 获取全部上传文件 @ Request getRequest() 返回Request对象, 通过该对象获得上传的表单中其他表单项的值 @ void setContentDisposition(String contentDisposition)用于将数据追加到MIME文件头的CONTENTDISPOSITION域。
@ void downloadFile(String source) 文件下载, 其中source为下载文件的文件名,可包含目录 @ void downloadFile(String source,String contentType) 文件下载,其中contentType为文件内容类型,即MIME格式的文件类型信息。 @ void downloadFile(String source,String contentType, String dest) 文件下载,其中dest是下载的文件另存为的文件名 @ void downloadFile(String source,String contentType, String dest, int blockSize)文件下载, 其中blockSize为存储读取的文件数据的字节数组的大小, 默认值为65000
2.文件上传与下载 动手实践: 使用jspSmartUpload组件完成新闻发布系统中新闻发布模块新闻附件的上传与下载功能。 目标: 掌握jspSmartUpload组件各类的用法; 理解文件上传与下载的原理。 学会设计具有上传功能的表单
3.图表开发 JFreeChart
JFreeChart是一个Java开源项目,它是一款优秀的基于Java的图表开发组件,提供了在Java应用程序和Java Web应用程序下生成各种图表的功能,包括柱形图、饼形图、线图、区域图、时序图和多轴图等,这些图表可以JPEG、 PNG等格式返回到应用程序中。 部署安装 : jfreechart-1.0.13.jar和jcommon-1.0.16.jar两个文件拷贝到Web应用程序的WEBINF/lib
配置web.xml
<servlet> <span style="white-space:pre"> </span><servlet-name>DisplayChart</servlet-name> <span style="white-space:pre"> </span><!-- DisplayChart具体的路径--> <span style="white-space:pre"> </span><servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class> </servlet> <servlet-mapping> <span style="white-space:pre"> </span><servlet-name>DisplayChart</servlet-name> <span style="white-space:pre"> </span><!--指定DisplayChart的URL映射路径,此处定义为/chart/DisplayChart--> <span style="white-space:pre"> </span><url-pattern>/chart/DisplayChart</url-pattern> </servlet-mapping> 3.图表开发类名 说明 JFreeChart 图表对象,生成任何类型图表都要通过该对象,JFreeChart插件提供了一个工厂类ChartFactory,用来创建各种类型的图表对象
XXXDataset 数据集对象,用来保存绘制图表的数据,不同类型的图表对应着不同类型的数据集对象,开发人员可以使用JDBC从数据库中提取数据填充数据集对象。
XXXPlot 绘图区对象,如果需要自定义绘图区的相关绘制属性,需要通过该对象进行设置 XXXAxis 坐标轴对象,用来定义坐标轴的绘制属性 XXXRenderer 图片渲染对象,用于渲染和显示图表 XXXURLGenerator 链接对象,用于生成Web图表中项目的鼠标单击链接 XXXToolTipGenerator 图表提示对象,用于生成图表提示信息, 不同类型的图表对应着不同类型的图表提示对象
使用jFreeChart开发步骤
第一步:创建绘图数据集合;
第二步:创建JFreeChart实例;
第三步:自定义图表绘制属性,该步可选;
第四步:生成指定格式的图片,并返回图片名称;
第五步:组织图片浏览路径;
第六步:通过HTML中的<img>标签显示图片。
动手实践: 假设软件工程一班考研的人数为16,就业的人数为29,出国留学的人数为4;软件工程二班考研的人数为12,就业的人数为36,出国留学的人数为6。请设计一个柱状图 统计各班考研、就业、留学的人数统计图。 目标: 掌握jFreeChart的安装与配置; 理解jFreeChart常用类的用法 4.分页显示
在分页显示中,需要用到几个概念:总记录数、每页显示记录数、当前页码、总页数。 总记录数:表示从数据库中检索出满足条件的记录总数量。 每页显示记录数:表示程序中设定的每页显示记录的最大个数。 总页数:总页数=总记录数/每页显示记录数(余数为0时);如果余数不为0,那么总页数=总记录数/每页显示记录数+1。 当前页码:当前JSP页面中显示记录的页码。 @ MySQL分页显示: SELECT * FROM `newsdb`.`message` LIMIT M, N @ SQL Server2000分页显示: SELECT TOP page_size * FROM table WHERE id NOT IN { SELECT TOP page_size * (current_page - 1) FROM table ORDER BY id } ORDER BY id @ SQL Server2005分页显示 SELECT TOP page_size * FROM { SELECT ROW_NUMBER() OVER (ORDER BY id) AS RowNumber, * FROM table } A WHERE rowNumber > page_size * (current_page - 1) 5.程序国际化 国际化的软件是指程序运行时,可依据软件使用者的地域和语言选择不同的程序界面和语言表述方式。国际化( Internationalization),由于这个单词太长了,不便于记忆,习惯上把它简称为I18N,因为在首尾字母I和N之间还有18字母。与国际化相对应的是本地化( Localization),也称为L10N。主要特征: @ 除了一些局部的数据,软件可以在全世界范围内正常运行; @ 诸如GUI组件上的标签和一些状态信息等文本元素,并不是硬编码在程序中,而是使用资源文件记录这些文本元素,然 后使程序和资源文件动态地绑定在一起,降低程序的耦合; @ 不需要重新编译即可支持新的语言; @ 与地域相关的日期、货币、数字表示形式能够自动符合本地用户的使用规范; @ 国际化的软件能够快速地本地化。 Java中,主要使用以下3个类实现程序的国际化。 @ java.util.ResourceBundle:用于加载一个国家或地区、语言资源包; @ java.util.Locale:用于封装一个特定国家或地区、语言环境;@ jaa.text.MessageFormat:用户格式化带占位符的字符串。
编写资源文件并保存至环境变量路径下
<span style="white-space:pre"> </span>可使用native2ascii命令转换 <span style="white-space:pre"> </span>native2ascii sourceFile destinationFile.properties <span style="white-space:pre"> </span>hello=你好! <span style="white-space:pre"> </span>greeting=很高兴见到你! <span style="white-space:pre"> </span>bye=再见,回头见! 在程序中绑定资源 //声明Locale和ResourceBundle对象 Locale currentLocale; ResourceBundle messages; //指定本地化国家和语言 currentLocale = new Locale(language, country); //绑定资源文件 messages = ResourceBundle.getBundle("ApplicationResource",currentLocal e); 在Java中可以使用NumberFormat类格式化数字,使用DateFormat类格式化日期。在java.text包中有一个抽象类Format,而NumberFormat和DateFormat类则是Format类的直接子类。方法 说明 public final String format(long number) 将数值、 日期格式化为字符串 public static Locale[] getAvailableLocales() 返回系统支持的Locale对象数组 public static final NumberFormat getCurrencyInstance()返回默认Locale的货币格式也可指定Locale public static final NumberFormat getNumberInstance()返回默认Locale的数值格式也可指定Locale public static final NumberFormat getPercentInstance()返回默认Locale的百分比格式, 也可指定Locale public Number parse(String source) 将字符串解析为数值、 日期 6.部署JAVA WEB应用
静态部署 @ 方式一:直接复制到Tomcat的安装目录webapps @ 方式二:建立虚拟目录 动态部署 @在Eclipse中使用导出工具,导出war文件格式; @按静态部署方式安装至Tomcat。
动手实践: 将自己开发的一个系统,如新闻发布系统打包,部署至Tomcat服务器上; 目标: 掌握Java Web应用程序的部署安装方式; 掌握Tomcat服务器的管理与维护。
6.本章小结
本章主要介绍了Java Web应用开发过程中遇到了一些难点,如中文问题、分页显示问题、上传与下载、图表开发、程序国际化和Java Web应用的部署等问题。针对每个问题都介绍了解决该问题的若干方法。希望读者在以后实际开发过程中,不断总结经验,提高解决实际问题的能力。 下一章: EL与JSTL 34