内容讲义达内java09servlet_第1页
内容讲义达内java09servlet_第2页
内容讲义达内java09servlet_第3页
内容讲义达内java09servlet_第4页
内容讲义达内java09servlet_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录一、 Servlet 概述01.1 B/S 架构(了解)01.21.3Servlet0Tomcat1如何写一个 Servlet(不使用开发工具)2使用 MyEclipse 开发 Servlet3Servlet 是如何运行的4常见错误及解决方式5案例:根据请求次数显示结果和显示当前时间5二、 HTTP 协议72.1HTTP 协议7通讯的过程7数据格式7TCP/IP Monitor 的使用82.5 get 请求与t 请求82.6 如何请求参数82.7数据库() 8数据库)92.8 案例:添加员工(2.9 异常:IllegalSeException10三、 编码问题113.1 Java 语言在内

2、存当中默认使用的字符集113.2 编码113.3 11Servlet 如何输出中文11如果表单有中文参数值,也需要注意编码问题11案例:根据请求正确显示中文113.7 将中文数据到数据库12四、 重定向134.1重定向13如何重定向13注意两个问题13两个特点13重定向原理图:以 2.8 案例为例13 14 14五、5.15.2 如何写一个 145.3 工厂类14六、 工厂设计模式156.1工厂15使用工厂设计模式的好处15如何使用工厂模式156.4 案例:为 2.8 案例添加新功能,并使用和工厂模式15七、 Servlet 容器处理细节18Servlet 容器如何处理请求资源路径以及匹配18

3、一个 Servlet 如何处理多种请求18八、 Servlet 的生命周期19Servlet 的生命周期的含义19Servlet 生命周期的四个阶段19实例化19初始化198.5 就绪198.6 销毁20Servlet 生命周期图20Servlet 生命周期相关的几个接口与类20九、 JSP(简要介绍,详细内容见 JSP 笔记)229.1JSP22为什么要使用 JSP22JSP 与 Servlet 的关系22如何写一个 JSP 文件22JSP 是如何运行的229.6 指令229.7 案例:创建 emplist.jsp 页面,将表示逻辑交给 JSP 处理23十、 请求转发2510.1转发25如何

4、转发25编程需要注意的两个问题25转发原理图25转发的特点25转发和重定向的区别26何时用重定向26何时用转发26案例:修改 6.4 案例中 step7 中的 ListEmpServlet.java26十一、 异常的处理29用输出流 out29用转发的方式29让容器处理系统异常29案例:将 10.9 案例中的 step3 中的所有 catch 块修改29十二、 路径问题3012.112.2相对路径30绝对路径30如何写绝对路径30如何防止硬编码30案例:相对、绝对路径对比3012.种情况下,正确的绝对路径写法31十三、 状态管理3213.1状态管理3213.2 如何进行状态管理3213.3 3

5、213.4 如何创建一个 3213.5 查询 3213.6 编码问题3313.713.813.9的生存时间33的路径问题33的限制3413.10 案例:写一个Util3413.11 ses(会话)3513.12 如何创建一个 ses对象3513.13 HttpSes接口中提供的常用方法3513.14 ses的超时3513.15 用户以后,如何继续使用 ses 3613.16 url 重写36sesses的优点36的缺点36案例:ses案例:验证和次数37 3813.21 案例:购物车39十四、 过滤器4414.1过滤器44如何写一个过滤器44案例:敏感字过滤器44过滤器的优先级45初始化参数4

6、614.6 优点46十五、15.1器47器4715.2 容器会产生两大类事件4715.3 如何写一个器47ServletContext(Servlet 上下文)47如何获得 Servlet 上下文47Servlet 上下文的作用4715.7 案例:统计人数48十六、 上传文件50如何上传文件50案例:上传文件50十七、 Servlet 线程安全问题52为何 Servlet 会有线程安全问题52如何处理线程安全问题52十八、 Servlet 小结5318.1 Servlet 基础5318.2 Servlet 53状态管理53数据库5318.5 过滤器和器5318.6 典型案例和扩展53十九、 其

7、他注意事项5419.1 连接数据库的工具5419.2 知名 5419.3 C/S 架构:Cnt/Server5419.4 B/S 架rowser/Server55一、Servlet 概述1.1 B/S 架构(了解)1)B/S 架构客户端使用浏览器,服务端使用 web 服务器,客户端跟服务器之间使用 HTTP 协议进行通讯。2)优点客户端不需要单独安装(因为使用浏览器);C/S 架构比较麻烦的是需要单独安装每个客户端,并且一旦客户端版本发生改变,就需要再次安装。开发相对简单;C/S 架构需要分别在,客户端和服务器端编写相应的通信处理模块和自定义协议,而 B/S 架构使用标准的 HTTP 协议(即

8、不再需要自定义协议),而且浏览器与 Web 服务器已经包含了相应的通信模块了。1.2ServletSun 公司制订的一种用来扩展 Web 服务器功能的组件规范。1)扩展 web 服务器功能早期(2000 年左右)的 Web 服务器:apache 的 web server、微软的 iis。只能够处理静态资源(即需要事先将 html 文件写好),不能够处理动态资源的请求(即需要依据请求参数然后进行计算,生成相应的页面)。为了让这些 web 服务器能够处理动态资源的请求,需要扩展他们的功能。早期使用的是 CGI 技术(Common Gatewayerface 通用网关接口),可以使用很多语言编写,如

9、 perl,C/C+等来开发 CGI 程序。但是 CGI 程序有几个问题,比如开发比较复杂(因为需要程序员自己去分析请求参数)、性能不佳(因为当 Web 服务器收到请求之后,会启动一个 CGI 进程来处理请求)、CGI 程序依赖现在,可以使用 Servlet 来扩展。(可移植性不好)。当浏览器将请求发送给 Web 服务器(比如:apcahe 的 web server),Web 服务器会向Servlet 容器发送请求,Servlet 容器负责请求数据包。当然,也包括网络通讯相关的一些处理,然后将之后的数据交给 Servlet 来处理(Servlet 只需要关注具体的业务处理,不用关心网络通讯相关

10、)。注意事项:可以不使用服务器,而直接向 Servlet 容器发送请求,因为 Servlet 容器里面也有个通信模块,所以也可直接把 Servlet 容器当作简单的 Web 服务器来使用。2)组件规范组件:是符合一定规范,并且实现部分功能的可以单独部署的须要部署到容器里面才能运行。容器:也是符合一定规范,并且提供组件的运行环境的程序。模块。组建必注意事项:单个的组件、单个的容器都是没意义的,都不能单独运行,需要放在一起才能运行。1.3TomcatTomcat 本身是一个 Servlet 容器,即可以提供 Servlet 运行环境的一个程序,但是 Tomcat还提供了 Web 服务器所具有的所有

11、功能,所以的默认端口是 8080。也称 Tomcat 是一个 Web 服务器。Tomcat1)安装 Tomcat(Linux 系统下安装和配置的步骤 step1:解压到/home/soft01 下 step2:配置环境变量)step3:启动Tomcat接下来,可以打开浏览器,输入step4:关闭Tomcat,验证是否配置成功。Windows 系统下安装和配置的步骤cd /home/soft01/tomcat 主目录/bin sh shutdown.shcd /home/soft01/tomcat 主目录/bin sh startup.sh 或者 sh catalina.sh runcd /ho

12、me/soft01 vi .bash_profileJAVA_HOME:jdk 的主目录CATALINA_HOME:tomcat 的主目录PATH:CATALINA_HOME/binstep1:解压到某个盘下step2:配置环境变量注意事项:新建系统变量或新建用户变量均可,建议新建用户变量。注意事项:如果环境变量中已经有 PATH,修改该 PATH 即可,使用“;”分号作分隔,如下所示:Windows 操作系统下以“;”分号为分隔符;linux 系统下以“:”冒号为分隔符。step3:启动Tomcat进入启动 Tomcat 的bin 目录下,双击“startup.bat”。接下来,可以打开浏览

13、器,输入step4:关闭Tomcat,验证是否配置成功。进入启动 Tomcat 的bin 目录下,双击“shutdown.bat”。2)Tomcat 目录结构简介bin 目录:存放启动和关闭服务器的一些(命令)。common 目录:共享(部署在该服务器上的所有程序都可以使用)的一些 jar 包。conf 目录:存放服务器的一些配置文件。webapps 目录:部署目录。work 目录:服务器运行时,生成的一些临时文件。 如何写一个 (不使用开发工具)step1:先写一个 Java 类,实现 Servlet 接口或者继承 HttpServlet 抽象类。public classoWorldServ

14、let extends HttpServlet /Tomcat 会自动调用 service,自己不用再去写方法调用了,所以必须把名字写对! public void service(HttpServletRequest request,HttpServletResponse response)throws ServletException,IOException/异常必须写两个,不能写成 Exception,也不能再多个异常/设置一个消息头 content-type,告诉浏览器返回的数据类型是一个 html 文档,以及编码格式。此外,还可以告诉服务器,在使用 out 输出时,使用指定的编码格式进

15、行编码response.setContentType(text/html;charset=utf-8);/通过响应对象,获得一个输出流 PrWriter out=response.getWriter();/调用流的方法进行输出,其实质是将处理结果写到了 response 对象上out.prln(o World);/* olose()不调用也可以,因为 Servlet 方法执行完毕,容器会自动调用 olose 方法*/PATH C:Program FilesJavajdk1.6.0_06bin ;D:apache-tomcat-5.5.23bin新建 CATALINA_HOME (可以不配置)。

16、新建 PATH(可以不配置)。JAVA_HOME(JDK 的主目录) 必须配置 CATALINA_HOME(Tomcat 的主目录)可以不配置 PATH(Tomcat 的bin 目录)可以不配置“电脑”右键“属性”,打开“系统属性”的“高级”选项卡,找到“环境变量。新建“用户变量”。新建 JAVA_HOME。step2:执行编译操作:javac -d .oWorldServlet.java但是会报错,找不到某些类!其中 -d . 代表把编译后的文件放在当前文件夹下。把 Tomcat 安装目录中 common 中 lib 中的 servlet-api.jar 和刚编写类放一起(是编译时需要用的

17、jar)。再次编译:javac -cp servlet-api.jar -d .oWorldServlet.java,其中 -cp servlet-api.jar 表示告诉 Java 编译器去哪里找需要的 class 文件(到 servlet-api.jar 的 jar 包中找)。step3:打包,即创建一个具有如下结构的文件夹:将编译好的.class 文件放入 classes 文件夹中(web.xml 文件内容:包,则一起放入)。step4:部署,将 step3 创建的文件夹拷贝到 Servlet 容器特定的文件夹下面(拷贝到 Tomcat的 webapps 目录下)。注意事项:也可以将 s

18、tep3 创建的文件夹使用 jar 命令进行压缩,生成.war 为后缀的文件,然后拷贝。step5:启动Servlet 容器,Servlet。 使用 开发 step1:配置MyEclipse,使得 MyEclipse 能够管理Tomcat。1)点击上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头,选择“Configure Server”。2)在弹出的框“Preferen”中展开“MyEclipse”-“- Servers”-“- Tomcat”-“- Tomcat5.X”注意事项:选择你目前电脑上 Tomcat 的版本,此处以 Tomcat5 为例

19、。3)将 Tomat server 选项置为“Enable”(默认为“Disable”)。格式:比如在浏览器地址栏输入:web-app ver=2.4 xmlns=h/xml/ns/j2eexmlns:xsi=xsi:schemaLocation=h/xml/ns/j2ee h/xml/ns/j2ee/web-app_2_4.xsdoWorldServletday01.oWorldServletoWorld/oappname(文件夹名起应用名)|WEB-INF(必须大写)classes(文件夹,放.class 文件)lib(文件夹,放.jar 文件,可没有)web.xml(部署描述文件 url

20、-pattern)olose();4)点击“Tomcat home directory”之后的“Browse”按钮,选择 Tomcat 主目录,确定,然后“Tomcat base directory”和“Tomcat temp directory”自动生成,点击“OK”。注意事项:两项可改可不改的:Tomcat 下的JDK-“Tomcat JDK name”是自己已安装的 JDK(Tomcat 也是 java写的也得依赖 JDK)。建议 Tomcat 下的 Launch-“Tomcat launch mode”设置为 Run mDebug mode 而该模式在有些时候会显示不正常。,默认为5)

21、回到上的“Run/Stop/Restart MyEclipse Servers”图标旁边的下拉箭头,选择Tomcat 5.x,点击“Start”。6)当在控制台显示“Server startup inms“,则 Tomcat 启动成功。注意事项:如果出现“Address already in use:JVM_Bind”异常,则说明已经启动了一个 Tomcat。解决办法:运行 shutdown 命令,关闭之前开启的 Tomcat。step2:建立一个 Web Project(Web 工程),填写“Project name”,JDK 最好选 5.0,其他选项默认,点击“Finish”。step3:

22、编写 Java 类和 web.xml 文件。step4:部署项目到 Tomcat 服务器。点击弹出“Deploy MyEclipse J2EE Project to Server”按钮。框“Project Deployments”,点击“Add”按钮。3)弹出“New Deployment”框,选择“Tomcat 5.x”,点击“Finish”,最后点击OK。注意事项:在框“Project Deployments”框有 4 个按钮,常用的为“Add”按钮:在 Tomcat 服务器上增加新应用。“Remove”按钮:删除 Tomcat 服务器上的新应用。“Redeploy”按钮:重新部署该应用,

23、一般每次修改后都需要重新部署一下。Tomcat 服务器上的 Servlet 实例。step5:注意事项:在 IDE 工具(集成开发环境)中启动 Tomcat 部署项目后,不需要重新启动服务器,系统会自动部署。IDE 工具简化了 Servlet 的开发步骤:第 1 步第 2 步第 3 步第 4 步第 5 步写一个 java 类 手动编译打包部署自动自动不用手动拷贝,点一下启动服务器,servlet 手动默认情况下,应用名和工程名相同。工程-属性-MyEclipse-Web-Web Context 可修改部署后的应用名。新建 Web 工程时也可以手动在 Context root RUL 中更改应用

24、名。 是如何运行 的比如,在浏览器地址栏输入:(web01/o 为请求资源路径)。step1:浏览器依据 ip 和port 建立与 Servlet 容器之间的连接。step2:浏览器将请求数据打包(即按照 http 协议的要求,将相关数据封装成一个数据包,一般称之为请求数据包)并发送给 Servlet 容器。step3:Servlet 容器请求数据包,并将之后得到的数据放到已创建的 request 对象上,同时,容器也已经创建好了一个 response 对象。格式:比如在浏览器地址栏输入:step4:Servlet 容器依据请求资源路径(即/web01/对象(根据 xml 文件里配置的类而创建

25、)。o)找到 Servlet 的配置,然后创建 Servletstep5:Servlet 容器接下来调用 Servlet 对象的 service 方法,并且会将事先创建好的 request 对象和 response 对象作为 service 方法的参数传递给 Servlet 对象。step6:Servlet 可以通过 request 对象获得请求参数,进行相应的处理,然后将处理结果写到response 对象上。step7:Servlet 容器给浏览器。response 对象上的数据,然后将处理结果打包(响应数据包)并发送step8:浏览器响应数据包,将返回的数据展现给用户。1.7 常见错误及解

26、决方式1)404:是一个状态码(是一个三位数字,由服务器发送给浏览器,告诉浏览器是否正确处理了请求),404 的意思是说:服务器依据请求资源路径,找不到对应的资源。解决:依据检查你的请求地址是否正确。仔细检查web.xml,特别要注意 servlet-name 是否一致。2)500:服务器处理出错,一般是因为程序运行出错。解决:检查程序的代码,比如:是否继承。检查 web.xml,类名要填写正确。 3)405:服务器找不到对应的 service 方法。解决:检查 service 方法的签名(方法名、参数类型、返回类型、异常类型)。1.8 案例:根据请求次数显示结果和显示当前时间eg1:在地址栏

27、输入后,获得 5 个o World注意事项:qty:请求参数名字。5:请求次数为 5。public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException/读请求参数值,返回值是 StringString qtyStr=request.getParameter(qty);qty=egarse(qtyStr);/转成整数 String rs=;for(i=0;iqty;i+)/处理请求,生成处理结果rs+=o World;/输出处理结果,设置

28、一个消息头 content-type,告诉浏览器返回的数据类型是一个 html 文档response.setContentType(text/html);PrWriter out=response.getWriter();/通过响应对象,获得一个输出流eg2:在网页上显示当前时间step1:Java 类中写step2:web.xml 中写:DateServletday01.DateDemoDate/datepublic void service (HttpServletRequest request,HttpServletResponse response) throws ServletExc

29、eption,IOException response.setContentType(text/html);/告诉浏览器返回的数据类型是一个 html 文档 PrWriter out=response.getWriter();/通过响应对象,获得一个输出流Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat(yyyy-MM-dd);String now=sdf.format(date);out.prln(now);/输出到页面olose();/调用流的方法进行输出,其实质是将处理结果写到了 response 对象上out

30、.prln(rs);olose();二、HTTP 协议2.1HTTP 协议HTTP(Hypertext transport protocol)是超文本传输协议。是一种应用层协议,由 W3C 制定,它定义了浏览器(或者其他客户端)与 Web 服务器之间通讯的过程及数据格式。2.2 通讯的过程step1:浏览器建立与 Web 服务器之间的连接(Socket)。step2:浏览器要将请求数据打包(请求数据包),然后发送给 Web 服务器。 step3:Web 服务器将处理结果打包(响应数据包),然后发送给浏览器。 step4:Web 服务器关闭连接。注意事项:特点:一次请求,一次连接。优点:Web

31、服务器可以利用有限的连接个数为尽可能多的客户服务(效率高)。如果浏览器要再发请求,就必须重新建立一个新的连接。2.3 数据格式1)请求数据包请求行:请求方式+请求资源路径+协议描述。若干消息头:消息头是一些键值对,一般由 W3C 定义,有特定的含义。浏览器和服务器之间,可以通过发送消息头来传递一些特定的信息,比如:浏览器可以通过 user-agent消息头来通知服务器浏览器的类型和版本。实体内容:只有当请求方式为t 时,浏览器才会将请求参数添加到实体内容里面,如果请求方式为 get,浏览器会将请求参数添加到请求资源路径的后面。 2)响应数据包状态行:协议描述+状态码+状态描述。若干消息头:服务

32、器也可以发送一些消息头给浏览器,比如 content-type,告诉浏览器服务器返回的数据类型和编码格式(字符集,比如:UTF-8、ISO-8859-1)。实体内容:程序处理之后,返回的结果。3)截获数据包,使用 MyEclipse 中的TCP/IP Monitor,TCP/IP Monitor 相当于一个服务器,它的原理图如下:2.4 TCP/IP Monitor 的使用1)Window-Show View-Other-MyEclipse Common-TCP/IP Monitor2)在 TCP/IP Monitor 的空白处点右键-Properties-弹出框点 Add,增加新的监视器:3

33、)点击 Start,启动服务器-OK。4)测试 1.8 案例 eg1,地址栏输入:,注意使用代理端!执行完毕,即可查看 TCP/IP Monitor 出现的内容。2.5 get 请求与t 请求1)哪些情况下,浏览器会使用 get 方式发请求:直接在浏览器地址输入某个地址。点击地址。t。表单默认的提交方法:form method=get(默认)/2)哪些情况下,浏览器会用t 方法发请求:设置表单的 method 属性值为“3)get 请求的特点:t”。get 请求会将请求参数添加到请求资源路径的后面,因为请求行存放的数据大小有限(也就是地址栏的最长字节数),所以 get 请求只能提交少量的数据。

34、get 请求会将请求参数显示在浏览器地址栏,不安全(比如,路由器会整个地址)。4)t 请求的特点:t 请求会将请求参数添加到实体内容里面,所以,可以提交大量的数据。t 请求不会将请求参数显示在浏览器地址栏,相对安全一些。但是,t 请求并不会对请求参数进行加理。用 HTTPS 协议进行加理。注意事项:服务器不关心是用浏览器还是 Java 程序发送的请求,只要符合协议格式,都会处理。2.6 如何请求参数方法一:String request.getParameter(String paraName);如果 paraName(即参数名称)与实际的参数名称不一致,会获得 null(不报错)。在使用表单提

35、交数据时,如果用户没有填写任何的值,会获得空字符串 。方法二:String request.getParameterValues(String paraName);当有多个参数且名称相同时,使用该方法。比如:?city=bj&city=cs&city=wh注意事项:getParameterValues 方法也可用于只有一个参数的情况。2.7数据库()1)使用登录数据库:-uroot;/登录,使用 root 用户权限查看当前所有的数据库:show databases;创建一个新的数据库:create database db_chang default character set utf8;/创建

36、 db_chang 数据库,默认是用 utf8 编码集(不能写减号 - )使用某个数据库:use db_chang;查看当前数据库有哪些表:show tables;建表:drop table tablname;/删表注意事项:auto_increment:自增长列,即一个唯一的值(相当于 Oracle 中的序列 sequence)。时,数据库会自动为该列赋2)使用 JDBC数据库step1:将 JDBC 驱动放到WEB-INFlib 下step2:编写 JDBC 代码,需要注意异常的处理! 案例:添加员工(数据库)step1:addEmp.html 页面内容:step2:ListEmpServ

37、let.java 中 service 方法内容:step3:AddEmp.java 中 service 方法内容:request.setCharacterEncoding(utf-8);String nameStr=request.getParameter(name); String salaryStr=request.getParameter(salary); String ageStr=request.getParameter(age); Pr Writer out=response.getWriter();Connection conn=null;/将员工信息 到数据库try Class

38、.forName(com. .jdbc.Driver);Connection conn=null;try Class.forName(com.jdbc.Driver);conn=DriverManager.getConnection(jdbc:/localhost:3306/db_chang,root,); Sement se=conn.createSement();ResultSet rs=se.executeQuery(select * from chang_emp order by id); response.setContentType(text/html;charset=utf-8)

39、;PrWriter out=response.getWriter();out.pr ln(); out.prln(id薪水); while(rs.next()long id=rs.getLong(id);String name=rs.getString(name);double salary=rs.getDouble(salary);age=rs.get(age);out.prln(+id+name+salary+ + +age+);out.prln();out.prln( 再次添加新员工);olose();catch(Exception e) e.prStackTrace();finally

40、 if(conn!=null) try conn.close();catch (SQLException e) e.prStackTrace(); 添加员工:薪水:create table chang_emp(idprimary key auto_increment, name varchar(50),salary double,age);inserto chang_emp(name,salary,age) values(tom,10000,23);step4:web.xml 内容(为了省纸,采取如下格式)step5:在浏览器地址栏输入2.9 异常:IllegalS应用名/list 则出员工列

41、表页面。eException出现如下错误可以不用理会,是因为 Tomcat 热部署造成的,重新手动部署一下即可: AddEmpServletday02.AddEmp ListEmpServletServletday02.ListEmpServlet AddEmp/addemp ListEmpServlet/listconn=DriverManager.getConnection(jdbc:/localhost:3306/db_chang,root,);/* 此处不妥若中文数据,会出现乱码!具体措施详见第三章! */ PreparedSement prep=conn.prepareSement(

42、inserto chang_emp(name,salary,age) values(?,?,?);prep.setString(1, nameStr);prep.setDouble(2, Double.parseDouble(salaryStr); prep.set(3,egarse(ageStr);prep.executeUpdate();/*response.setContentType(text/html;charset=utf-8);out.prln(添加成功); out.prln(再次添加);/不使用重定向*/response.sendRedirect(list);/使用重定向,详见

43、第四章olose(); catch (Exception e) /* 异常发生之后,首先 日志,一般会将日志 到文件里面,可以用一些日志工具,比如 log4j 来 */e.prStackTrace();/* 接下来,看异常能否恢复,如果能,则编写处理代码。如果不能,则提示用户稍后重试。一般来说,系统异常是不能恢复的,所谓系统异常:指的是不是因为程序的原因产生的异常,比如:数据库服务停止、连接数据库的网络中断等 */response.setContentType(text/html;charset=utf-8); out.prln(系统繁忙,稍后重试);out.prln(重试);finally/

44、与 step2 相同,此处略三、编码问题 语言在内存当中默认使用的字符集默认会用“Unicode”编码格式(字符集)来保存字符。 编码把 Unicode 这种编码格式对应的字节数组,转换成某种本地编码格式(比如 GBK)对应的字节数组,从而保存。Unicode-GBK。把某种本地编码格式的字节数组转换成 Unicode 这种编码格式对应的字节数组。GBK-Unicode。注意事项:服务器默认使用 ISO-8859-1 编码格式,使用 1 个字节保存,无法存中文!因此中文会出现乱码。 如何输出中文需要调用:response.setContentType(text/html;charset=utf

45、-8);其中 charset=utf-8 表示:用来指定编码格式,只要支持中文即可,比如也可设置为 charset=gbk。作用两个:生成一个 content-type 消息头,告诉浏览器返回的数据类型和编码格式。服务器在输出时,会使用指定的编码格式进行编码。 如果表单有中文参数值,也需要注意编码问题因为,当表单提交的时候,浏览器会对表单中的数据进行编码(会使用打开表单时的编码格式进行编码),而服务器默认情况下,会使用 ISO-8859-1 去题。1)解决方式一:,所以,会产生乱码问step1:先保证表单所在的页面按照指定的编码格式打开。即:已是一种规范(模拟 content-type 消息头

46、,告诉浏览器正在的数据类型和编码格式)。step2:调用 request.setCharacterEncoding(utf-8);意思是告诉服务器,使用指定的编码格式进行。注意事项:该方法只能用于 request.getParameter()方法前。2)解决方式二:step1:同方式一的第一步。t请求!注意代码放置顺序,在step2:使用new String(str.getBytes(iso-8859-1),utf-8); 案例:根据请求正确显示中文step1:表单页面请输入数量: 打招呼的人:比如:String name=request.getParameter(uname);name =

47、new String(name.getBytes(iso-8859-1),utf-8);step2:oWorldServlet 类中 service 方法写 将中文数据到数据库程序从内存 Unicode 编码格式数据库中的某种本地格式。step1:要确保数据库支持中文,即正确设置数据库的字符集。step2:JDBC 驱动必须能够正确地进行编码和。有些的驱动不能够正确进行编码和(默认使用 ISO-8859-1 进行编码和),可以在 JDBC 的 URL 后添加:“useUnicode=true&characterEncoding=utf8”。注意事项:中 utf 不能写“-”,记得数据库名后有个

48、“?”。客户端也是一个程序,也会有编码问题,若你的程序中数据显示正常,客户端中查询的数据为乱码,则更改下编码,使用:set names gbk;命而令。例如:conn=DriverManager.getConnection(jdbc:/localhost:3306/db_chang? + useUnicode=true&characterEncoding=utf8,root,);例如,建的数据库时设置编码:create database db_chang default character set utf8;/request.setCharacterEncoding(utf-8);/方式一St

49、ring qtyStr=request.getParameter(qty);/读请求参数值 qty=egarse(qtyStr);/转成整数String uname=request.getParameter(uname);uname = new String(uname.getBytes(iso-8859-1),utf-8);/方式二 String rs=;/处理请求,生成处理结果for(i=0;iqty;i+) rs+=你好, +uname +; /* 输出处理结果,设置一个消息头 content-type,告诉浏览器返回的数据类型是一个 html文档,以及编码格式。此外,还可以告诉服务器,

50、在使用 out 输出时,使用指定的编码格式进行编码 */response.setContentType(text/html;charset=utf-8);PrWriter out=response.getWriter();/通过响应对象,获得一个输出流out.prln(rs);/调用流的方法进行输出,其实质是将处理结果写到了 response 对象上olose();四、重定向4.1重定向服务器发送一个 302 状态码及一个 Location 消息头(值是一个地址,称为重定向地址),通知浏览器立即向重定向地址发请求。如何重定向使用 response.sendRedirect(String url

51、);注意两个问题1)重定向之前,不要调用 olose();会报错!2)重定向之前,服务器会先清空 response 对象上缓存的数据。Servlet 只允许同时发送一个响应。两个特点重定向的地址是任意的(前提要存在否则报 404)。重定向之后,浏览器地址栏的地址会变成重定向地址。重定向原理图:以 2.8 案例为例out.prln(添加成功);/看不到这个输出!缓存数据被清空(响应一) response.sendRedirect(list);/能看到重定向结果!(响应二)olose();out.prln(添加成功);/能看到这个输出!(如果不写这个输出,则响应为空白页) olose();resp

52、onse.sendRedirect(list);/看不到重定向结果!五、5.1Data Acs Object,即封装了数据逻辑的一个模块。5.2 如何写一个step1:实体类step2:接口step3:实现step4:工厂5.3 工厂类封装了对象的创建细节,为调用者提供符合要求的对象。详细介绍见第六章。Connection conn=DriverManager.getConnection./DriverManager 就是个工厂类,调用者通过 DriverManager 工厂类获得一个符合 Connection 接口要求的对象 conn使用具体的技术来实现接口。比如,EmployeeJdbcI

53、mpl 类一系列方法,这些方法不应该涉及任何具体的数据库技术。比如,Employee接口:public ResultSet findAll();/错误的!因为 ResultSet 限制了只能是用 JDBC 来实现public List findAll() throws SQLException;/错误的!因为限制了只能是用 JDBC 来实现,SQLException 是 JDBC 的错误public List findAll();/正确的!public List findAll() throws Exception;/正确的!为了方便对数据库中的 进行操作而封装的一个普通的 Java 类。比

54、一个表 chang_emp,可以根据表中的字段设计一个 Employee 类,属性名与表中的字段名相同,且有 get/set 方法。六、工厂设计模式工厂工厂是一个设计模式,所谓设计模式,是为解决一类相同或者相似一套解决方案,并且会对这个解决方案命名,比如工厂就是一个常用的设计模式。 使用工厂设计模式的好处工厂为调用者提供符合接口要求的对象(对这对象一般称为产品),这样做的好处是,调用者不用了解对象的创建细节,这样,当对象创建过程发生改变,不会影响到调用者。工厂也可以从配置文件来获得接口与其对应的实现类的配置信息。这样,当实现类发生改变时,也不用再去修改工厂类的源代码了。 如何使用工厂模式现在做

55、这样一个假设,假如的底层数据不再使用 JDBC,而采用 Hibernate(框架技术,后续会学习,此处做了解)。那么需要为 Employee增加一个实现 EmployeeHibernateImpl.java并且修改之前的代码,DelEmpServlet、AddEmpServlet、ListEmpServlet、LoadEmpServlet、ModifyEmpServlet 都要做相应修改(new 的地方都要换成 EmployeeHibernateImpl 对象)。 案例:为 案例添加新功能,并使用step1:创建DBUtil.java 类,专门用于连接和关闭数据库:和工厂模式step2:创建E

56、mployee.java 实体类:有 id、name、salary、age 四个属性,以及 get/set 方法。step3:创建接口 Employeestep4:创建接口的实现类 EmployeeJdbcImpl:public List findAll() throws Exception/查找所有员工 List employees=new ArrayList(); Connection conn=DBUtil.getConnection();Sement se=conn.createSement();ResultSet rs=se.executeQuery(select * from ch

57、ang_emp order by id);public List findAll() throws Exception; public void add(Employee e)throws Exception; public void deleong index)throws Exception; public void modify(Employee e)throws Exception; public Employee findById(long id) throws Exception;public sic Connection getConnection() throws Except

58、ion Connection conn=null;try Class.forName(com.jdbc.Driver); conn=DriverManager.getConnection(jdbc:/localhost:3306/db_chang? +useUnicode=true&characterEncoding=utf8,root,); catch (Exception e) e.prStackTrace();throw e; return conn;public sic void close(Connection conn)if(conn!=null)try conn.close();

59、 catch (SQLException e) e.prStackTrace();step5:创建Factory.java 工厂类:step6:修改 AddEmp关闭).java 中的try 块,finally 块也不需要了(中调用了 DBUtil 的step7:修改 ListEmpServlet.java 中的 try 块,finally 块也不需要了(关闭)中调用了 DBUtil 的try Employee=(Employee) Factory.getInstance(Employee);List Employees=new ArrayList();Employees=.findAll()

60、;try Employee=(Employee) Factory.getInstance(Employee); Employee e=new Employee();e.setName(name);e.setSalary(salary); e.setAge(age);.add(e);response.sendRedirect(list);public s ic Object getInstan tring type) Object obj=null; if(Employee .equals(type)obj=new Employee JdbcImpl();/* obj=new Employee

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论