Servlet简介
Servlet是sun公司提供的一门用于开发动态web资源的技术。
Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个Java程序向浏览器输出数据),需要完成以下2个步骤:
编写一个Java类,实现servlet接口。
把开发好的Java类部署到web服务器中。
快速入门,用servlet向浏览器输出“hello servlet”。
阅读Servlet API,解决两个问题:
输出hello servlet的java代码应该写在servlet的哪个方法内?
如何向IE浏览器输出数据?
第一个Servlet的编写
动手练习
完成目标:利用Servlet向客户端输出”HelloSerlvet”
执行过程
客户端发出请求http://localhost:8080/Demo1/hello
根据web.xml文件的配置,找到
找到
读取
到Tomcat安装目录/webapps/Demo1/WEB-INF/classes/cn/itcast目录下查找到HelloServlet.class文件
Servlet的运行过程
Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后:
Web服务器首先检查是否已经装载并创建了该Servlet的实例对象。如果是,则直接执行第④步,否则,执行第②步。
装载并创建该Servlet的一个实例对象。
调用Servlet实例对象的init()方法。
创建一个用于封装HTTP请求消息的HttpServletRequest对象和一个代表HTTP响应消息的HttpServletResponse对象,然后调用Servlet的service()方法并将请求和响应对象作为参数传递进去。
WEB应用程序被停止或重新启动之前,Servlet引擎将卸载Servlet,并在卸载之前调用Servlet 的destroy()方法。
Servlet接口实现类
Servlet接口SUN公司定义了两个默认实现类,分别为:GenericServlet、HttpServlet。
HttpServlet指能够处理HTTP请求的servlet,它在原有Servlet接口上添加了一些与HTTP协议处理方法,它比Servlet接口的功能更为强大。因此开发人员在编写Servlet时,通常应继承这个类,而避免直接去实现Servlet接口。
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式,如为GET请求,则调用HttpServlet的doGet方法,如为Post请求,则调用doPost 方法。因此,开发人员在编写Servlet时,通常只需要覆写doGet或doPost方法,而不要去覆写service方法。
阅读HttpServlet API文档,看一下servlet-api.jar
Servlet的一些细节(2)
Servlet的一些细节(3)
对于如下的一些映射关系:
Servlet1 映射到/abc/*
Servlet2 映射到/*
Servlet3 映射到/abc
Servlet4 映射到*.do
问题:
当请求URL为“/abc/a.html”,“/abc/*”和“/*”都匹配,哪个servlet响应Servlet引擎将调用Servlet1。
当请求URL为“/abc”时,“/abc/*”和“/abc”都匹配,哪个servlet响应Servlet引擎将调用Servlet3。
当请求URL为“/abc/a.do”时,“/abc/*”和“*.do”都匹配,哪个servlet响应Servlet引擎将调用Servlet1。
当请求URL为“/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应
Servlet引擎将调用Servlet2。
当请求URL为“/xxx/yyy/a.do”时,“/*”和“*.do”都匹配,哪个servlet响应Servlet引擎将调用Servlet2。
Servlet的一些细节(4)
如果某个Servlet的映射路径仅仅为一个正斜杠(/),那么这个Servlet就成为当前Web应用程序的缺省Servlet。
凡是在web.xml文件中找不到匹配的
Servlet是一个供其他Java程序(Servlet引擎)调用的Java类,它不能独立运行,它的运行完全由Servlet引擎来控制和调度。
针对客户端的多次Servlet请求,通常情况下,服务器只会创建一个Servlet实例对象,也就是说Servlet实例对象一旦创建,它就会驻留在内存中,为后续的其它请求服务,直至web 容器退出,servlet实例对象才会销毁。
在Servlet的整个生命周期内,Servlet的init方法只被调用一次。而对一个Servlet的每次访问请求都导致Servlet引擎调用一次servlet的service方法。对于每次访问请求,Servlet引擎都会创建一个新的HttpServletRequest请求对象和一个新的HttpServletResponse响应对象,然后将这两个对象作为参数传递给它调用的Servlet的service()方法,service方法再根据请求方式分别调用doXXX方法。
Servlet的生命周期(2)
如果在
举例:
org.apache.catalina.servlets.InvokerServlet
用途:为web应用写一个InitServlet,这个servlet配置为启动时装载,为整个web应用创建必要的数据库表和数据。
Servlet的线程安全
当多个客户端并发访问同一个Servlet时,web服务器会为每一个客户端的访问请求创建一个线程,并在这个线程上调用Servlet的service方法,因此service方法内如果访问了同一个资源的话,就有可能引发线程安全问题。
如果某个Servlet实现了SingleThreadModel接口,那么Servlet引擎将以单线程模式来调用其
service方法。
SingleThreadModel接口中没有定义任何方法,只要在Servlet类的定义中增加实现SingleThreadModel接口的声明即可。
对于实现了SingleThreadModel接口的Servlet,Servlet引擎仍然支持对该Servlet的多线程并发访问,其采用的方式是产生多个Servlet实例对象,并发的每个线程分别调用一个独立的Servlet实例对象。
实现SingleThreadModel接口并不能真正解决Servlet的线程安全问题,因为Servlet引擎会创建多个Servlet实例对象,而真正意义上解决多线程安全问题是指一个Servlet实例对象被多个线程同时调用的问题。事实上,在Servlet API 2.4中,已经将SingleThreadModel标记为Deprecated(过时的)。
解决并发问题
解决并发出现的问题,可以采用以下方式:
使用Java同步机制对多线程同步:运行效率低
使用SingleThreadModel接口
合理决定在Servlet中定义的变量的作用域
ServletConfig对象
在Servlet的配置文件中,可以使用一个或多个
当servlet配置了初始化参数后,web容器在创建servlet实例对象时,会自动将这些初始化参数封装到ServletConfig对象中,并在调用servlet的init方法时,将ServletConfig对象传递给servlet。进而,程序员通过ServletConfig对象就可以得到当前servlet的初始化参数信息。
阅读ServletConfig API,并举例说明该对象的作用:
获得字符集编码
获得数据库连接信息
ServletContext
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。
由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。
查看ServletContext API文档,了解ServletContext对象的功能。
ServletContext应用
多个Servlet通过ServletContext对象实现数据共享。
获取WEB应用的初始化参数。
实现Servlet的转发。
利用ServletContext对象读取资源文件。
.properties文件(属性文件)
得到文件路径(ServletContext.getRealPath(),ServletContext.getReaourceAsStream())
思考:如果一个普通类该如何读取配置文件??
读取资源文件的三种方式
练习:实现文件下载
Web应用的工作目录
每个Web应用都有一个工作目录,Servlet容器会把与这个Web应用相关的临时文件存放在这个目录下。Tomcat为web应用提供的默认工作目录为:
Tomcat安装目录/work/[enginename]/[hostname]/[contextpath]
Web应用的工作目录不仅可以被Servlet容器访问,还可以被Web应用的Servlet访问。Servlet 规范规定,当Servlet容器在初始化一个web应用时,应该向刚创建的ServletContext对象中设置一个名为“javax.servlet.context.tempdir”的属性,它的属性值为一个java.io.File对象,它代表当前web应用的工作目录。
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了。
response常见应用
向客户端输出中文数据
用OutputStream(字节流)发送数据:
1、response.getOutputStream().write(“中国”.getBytes());//以默认编码发送数据
2、response.getOutputStream().write("中国".getBytes("UTF-8"));//以UTF-8编码发送数据,浏
览器(默认用GB2312)会出现乱码
画图描述出现该问题的原因。
解决办法:
2.1通过更改浏览器的编码方式:IE/”查看”/”编码”/”UTF-8”(不可取)
2.2通过设置响应头告知客户端编码方式:response.setHeader(“Content-type”, “text/html;charset=UTF-8”);//告知浏览器数据类型及编码
2.3通过meta标签模拟请求头:out.write("".getBytes());
2.4通过以下方法:response.setContentType("text/html;charset=UTF-8");
总结:程序以什么编码输出,就需要告知客户端以什么编码显示。
小细节:输出字符“1”用response.getOutputStream().write(1);出现的问题?
response常见应用
向客户端输出中文数据
用PrintWriter(字符流)发送数据:
示例:response.getWriter().write(“中国”);有没有乱码?
原因:以默认编码发送数据ISO-8859-1(没有中国二字编码),此时会发生乱码
解决办法:
setCharacterEncoding(“UTF-8”);//更改编码为UTF-8
response.setHead(“Context-type”,”text/html;charset=UTF-8”);//告诉客户端编码方式
注意:不要忘记告诉客户端的编码方式。
由于经常改动编码,response提供了一种更简单的方式
response. setContentType(“text/html;charset=UTF-8”);其作用相当于以上两条代码。
response常见应用
发送http头,控制浏览器缓存当前文档内容
response.setDateHeader(“Expires”, System.currentTimeMillis()+1000*60*60);//缓存1小时,注意此处是相对于1970年1月1日00:00:00的时间
作用:有些不怎么变化的数据,利用缓存能减轻服务器的负担。
查看一下IE的缓存文件
通过response实现请求重定向。
请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。
地址栏会变,并发送2次请求,增加服务器负担
实现方式
response.sendRedirect()
实现原理:
302状态码和location头即可实现重定向
response细节
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。会抛异常。
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应消息的正文,然后再与响应状态行和各响应头组合后输出到客户端。
Serlvet的service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出流对象是否已经调用过close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。
HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP 请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。
查看request的API文档
request常用方法
获得客户机信息
getRequestURL方法返回客户端发出请求时的完整URL。
getRequestURI方法返回请求行中的资源名部分。
getQueryString 方法返回请求行中的参数部分。
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址。
getLocalName方法返回WEB服务器的主机名
getMethod得到客户机请求方式
Request常用方法
获得客户机请求头
getHead(name)方法
getHeaders(String name)方法
getHeaderNames方法
获得客户机请求参数(客户端提交的数据)
getParameter(name)方法
getParameterValues(String name)方法
getParameterNames方法
getParameterMap方法//做框架用,非常实用
getInputStream
request常见应用1
各种表单输入项数据的获取
text、password、radio、checkbox、
file、select、textarea、hidden、
image、button给js编程用
请求参数的中文乱码问题
浏览器是什么编码就以什么编码传送数据
解决:request.setCharacterEncoding(“UTF-8”);//POST有效
new String(username.getBytes(“ISO-8859-1”),“UTF-8”);//GET方式
超链接:cn//GET方式
更改Tomcat的配置解决URL编码问题:
request对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。
request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。
request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。
setAttribute方法
getAttribute方法
removeAttribute方法
getAttributeNames方法
转发和包含
一个Servlet对象无法获得另一个Servelt对象的引用;如果需要多个Servet组件共同协作(数据传递),只能使用Servelt规范为我们提供的两种方式:
请求转发:Servlet(源组件)先对客户请求做一些预处理操作,然后把请求转发给其他web组件(目标组件)来完成包括生成响应结果在内的后续操作。
包含:Servelt(源组件)把其他web组件(目标组件)生成的响应结果包含到自身的响应结果中。转发和请求的共同点
源组件和目标组件处理的都是同一个客户请求,源组件和目标组件共享同一个ServeltRequest和ServletResponse对象
目标组件都可以为Servlet、JSP或HTML文档
都依赖javax.servlet.RequestDispatcher接口
RequestDispather
表示请求分发器,它有两个方法:
forward():把请求转发给目标组件
public void forward(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException
include():包含目标组件的响应结果
public void include(ServletRequest request,ServletResponse response)
throws ServletException,java.io.IOException
得到RequestDispatcher对象
1、ServletContext对象的getRequestDispather(String path1)
path1必须用绝对路径,即以”/”开头,若用相对路径会抛出异常IllegalArgumentException 2、ServletRequest对象的getRequestDispatcher(String path2)
path2可以用绝对路径也可以用相对路径
转发
dispatcher.forward(request,response)的处理流程:
1、清空用于存放响应正文数据的缓冲区
2、如果目标组件为Servlet或JSP,就调用它们,把它们产生的响应结果发送到客户端;如果目标组件为文件系统中的静态HTML文档,就读取文档中的数据并把它发送给客户端。
特点:
1、由于forward()方法先清空用于存放响应正文数据的缓冲区,因此源组件生成的响应结果不会被发送到客户端,只有目标组件生成的响应结果才会被送到客户端。
2、如果源组件在进行请求转发之前,已经提交了响应结果(如调用了response的flush或close方法),那么forward()方法会抛出IllegalStateException。为了避免该异常,不应该在源组件中提交响应结果。
包含
include()方法的处理流程:
1、如果目标组件为Servlet或JSP,就执行它们,并把它们产生的响应正文添加到源组件的响应结果中;如果目标组件为HTML文档,就直接把文档的内容添加到源组件的响应结果中。
2、返回到源组件的服务方法中,继续执行后续代码块。
特点:
1、源组件与被包含的目标组件的输出数据都会被添加到响应结果中。
2、在目标组件中对响应状态代码或者响应头所做的修改都会被忽略。
请求范围
web应用范围内的共享数据作为ServeltContext对象的属性而存在(setAttribute),只要共享ServletContext对象也就共享了其数据。
请求范围内的共享数据作为ServletRequest对象的属性而存在(setAttribute),只要共享ServletRequest对象也就共享了其数据。
重定向
重定向机制的运作流程
1、用户在浏览器端输入特定URL,请求访问服务器端的某个组件
2、服务器端的组件返回一个状态码为302的响应结果。
3、当浏览器端接收到这种响应结果后,再立即自动请求访问另一个web组件
4、浏览器端接收到来自另一个web组件的响应结果。
HttpServeltResponse的sendRedirect(String location)用于重定向
特点
Servlet源组件生成的响应结果不会被发送到客户端。response.sendRedirect(String location)方法一律返回状态码为302的响应结果。
如果源组件在进行重定向之前,已经提交了响应结果,会抛出IllegalStateException。为了避免异常,不应该在源组件中提交响应结果。
在Servlet源组件重定向语句后面的代码也会执行。
源组件和目标组件不共享同一个ServletRequest对象。
对于sendRedirect(String location)方法的参数,如果以“/”开头,表示相对于当前服务器根路径的URL。以“http"//”开头,表示一个完整路径。
目标组件不必是同一服务器上的同一个web应用的组件,它可以是任意一个有效网页。
会话
问题:什么是会话?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中要解决的一些问题?
每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。思考:用户购买的商品保存在request或servletContext中行不行?
保存会话数据的两种技术
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web 资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
Cookie API
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie 方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:
public Cookie(String name,String value)
setValue与getValue方法
setMaxAge与getMaxAge方法(秒)
setPath与getPath方法
setDomain与getDomain方法
getName方法
Cookie细节
一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除
session
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
Cookie是把用户的数据写给用户的浏览器。
Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session 对象。
session案例
使用Session完成简单的购物功能
IE禁用Cookie后的session处理
实验演示禁用Cookie后servlet共享数据导致的问题。解决方案:URL重写
response. encodeRedirectURL(https://www.doczj.com/doc/5514643503.html,ng.String url)
用于对sendRedirect方法后的url地址进行重写。response. encodeURL(https://www.doczj.com/doc/5514643503.html,ng.String url)
用于对表单action和超链接的url地址进行重写
附加:
Session的失效
Web.xml文件配置session失效时间
使用Session完成用户登陆
利用Session防止表单重复提交
利用Session实现一次性验证码
session案例-防止表单重复提交
表单页面由servlet程序生成,servlet为每次产生的表单页面分配一个唯一的随机标识号,并在FORM表单的一个隐藏字段中设置这个标识号,同时在当前用户的Session域中保存这个标识号。
当用户提交FORM表单时,负责处理表单提交的serlvet得到表单提交的标识号,并与session 中存储的标识号比较,如果相同则处理表单提交,处理完后清除当前用户的Session域中存储的标识号。
在下列情况下,服务器程序将拒绝用户提交的表单请求:
存储Session域中的表单标识号与表单提交的标识号不同
当前用户的Session中不存在表单标识号
用户提交的表单数据中没有标识号字段
编写工具类生成表单标识号:TokenProcessor
session案例一次性校验码
一次性验证码的主要目的就是为了限制人们利用工具软件来暴力猜测密码。
服务器程序接收到表单数据后,首先判断用户是否填写了正确的验证码,只有该验证码与服务器端保存的验证码匹配时,服务器程序才开始正常的表单处理流程。
密码猜测工具要逐一尝试每个密码的前题条件是先输入正确的验证码,而验证码是一次性有效的,这样基本上就阻断了密码猜测工具的自动地处理过程。
处理流程以及数据提取方法一、投诉处理流程 二、SEQ提取数据方法 VOLTE用户投诉处理(支持实时和历史记录详单) 1、登录后,SQM》投诉用户单据查询 2、投诉用户单据查询-跟踪号码 输入号码136XXXX0505
3、投诉用户单据查询-数据查询结果(均可钻取详单) 4、投诉用户会话跟踪-创建跟踪任务(提取信令) 5、投诉用户会话跟踪-实时跟踪结果 6、信令详单提取
7、语音质量单据查询(这功能暂时我们没权限) 可针对单号码进行语音、视频质量查询,查询单号码某次通话过程中GM\S1-U口丢包情况、是否存在单通、单通时长,同时可以通过5S分片具体定位丢包时间点。
三、VOLTE根据信令分析 TD-LTE__VoLTE-SIP完整信令解析 对关键流程的解释如下表所示: 1)主叫发INVITE消息,触发主叫RRC建立过程,INVITE消息中包含被叫方的号码,主叫方支持的媒体类型和编码等。
2)主叫建立SRB2信令无线承载,QCI9默认承载和QCI5 SIP信令无线承载。例如在本例中,信令无线承载SRB-ID=2;QCI=9的默认承载的eps-BearerID=5,DRB-ID=3;QCI=5的SIP信令承载的eps-BearerID=6,DRB-ID=4 3)核心网侧收到主叫的INVITE消息以后,给主叫发送INVITE的应答消息,INVITE 100表示正在处理中。 4)核心网向处于空闲态的被叫发INVITE消息,由于被叫处于空闲态,所以核心网侧触发寻呼消息,寻呼处于空闲态的被叫用户 5)被叫建立SRB2信令无线承载,QCI9默认承载和QCI5 SIP信令无线承载 6)核心网在QCI5 RB承载上,给被叫用户发送INVITE消息 7)被叫对INVITE消息的响应 被叫收到寻呼但未收到INVITE请求,核心网问题 8)被叫方通知主叫方,自己所支持的媒体类型和编码。 9)主叫建立QCI1的数据无线承载,用于承载语音数据,使用UM方式。例如本例中,eps-BearerID=7,DRB-ID=5。关键参数包括头压缩参数,TTI Bundling,SPS。DRX参数也会按照语音业务的要求进行重新配置。 10)被叫建立QCI1的数据无线承载。例如本例中QCI1承载的eps-BearerID=7,DRB-ID=5。 11)核心网通知主叫终端的SM层,建立QCI=1的承载,例如:eps-BearerID=7 12)主叫收到被叫的INVITE 183消息 被叫上发sip183后,在激活EPS承载之前,终端上报了1条A3测报,激活EPS后,发生切换重配置消息中释放了QCI=1的DRB。起呼时MME进行激活EPS承载流程过程中,恰好发生S1切换时,由于EPS承载建立未完成,MME在切换准备阶段,对下发到目标小区的切换准备的请求消息中不携带QCI=1的VOLTE专载,导致VOLTE专载源小区完成的情况下,在目标小区被释放,切换完成后呼叫中断,重配置消息释放DRB承载,无线网与核心网配合问题 13)核心网通知被叫终端的SM层,建立qci=1的承载 14)主叫收到INVITE 183消息以后,发送确认消息PRACK,启动资源预留过程, 15)被叫收到主叫的PRACK以后,返回PRACK 200响应,启动资源预留过程, 16)主叫收到被叫的PRACK 200以后,发送UPDATE消息,标明资源预留成功。
应用Servlet实现购物车 具体实现过程 1、创建封装商品信息的值JavaBean---------GoodsSingle package com.yxq.valuebean; public class GoodsSingle { private String name; //保存商品名称 private float price; //保存商品价格 private int num; //保存商品购买数量public String getName() { return name; } public void setName(String name) { https://www.doczj.com/doc/5514643503.html, = name; } public int getNum() { return num; } public void setNum(int num) { this.num = num; }
public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } } 2、创建工具JavaBean-------- MyTools 实现字符型数据转 换为整型及乱码处理 package com.yxq.toolbean; import java.io.UnsupportedEncodingException; public class MyTools { public static int strToint(String str){ //将String型数据转换为int型数据的方法 if(str==null||str.equals("")) str="0"; int i=0; try{ i=Integer.parseInt(str); //把str 转换成
《Java Web应用开发》本科复习题 一、单项选择题 1、ServletContext接口的(d)方法用于将对象保存到Servlet上下文中 A、GetServletContext() B、GetContext() C、GetAttributes() D、SetAttributes() 2、(a)指令用于将文件嵌入JSP页面 A、include B、taglib C、page D、language 3、在HTTP协议中,用于发送大量数据的方法是(a) A、post B、get C、put D、options 4、JSP表达式语言用于访问(d )中存储的数据 A、a pplet B、Servlet C、Java程序 D、JavaBean 5、Http协议的状态码(b)指示已成功处理请求 A、100 B、200 C、80 D、404 6、J2EE 中, JSP EL表达式:${user.loginName}的执行效果等同于(d);
A、<%=user.loginName%> B、<%user. loginName%> C、<%user.getLoginName();%> D、<%=user.getLoginName()%> 7、Http是一个(a )协议 A、无状态 B、有状态 C、状态良好 D、局域网 二、多项选择题 8、有关MVC设计模式,不正确的描述有(bd ) A、使用Servlet作为控制器 B、MVC设计模式增大了维护难度 C、MVC设计模式属于Model 2 D、模型对象向客户端显示应用程序界面 9、有关会话跟踪技术描述正确的是(abcd) A、Cookie是Web服务器发送给客户端的一小段信息,客户端请求时,可以读取该信息 发送到服务器端 B、关闭浏览器意味着会话ID丢失,但所有与原会话关联的会话数据仍保留在服务器上, 直至会话过期 C、在禁用Cookie时可以使用URL重写技术跟踪会话 D、session是HttpSession接口的实例 10、有关JSP隐式对象,以下(acd )描述正确 A、隐式对象是WEB容器加载的一组类的实例,可以直接在JSP页面使用 B、不能通过config对象获取ServletContext对象 C、response对象通过sendRedirect方法实现重定向 D、只有在出错处理页面才有exception对象 11、MVC模式包括哪几个层(acd) A、模型层
会话管理 1、会话管理基本原理 实现会话管理的基本方式,如隐藏域(Hidden Field)、Cookie与URL重写(URL Rewriting)的实现方式。 1.使用隐藏域 隐藏域就是主动告知服务器多次请求间必要信息的方式之一。 这个方法不适合用于隐密性较高的数据。 隐藏域不是Servlet/JSP实际管理会话时的机制。 2.使用Cookie Cookie是在浏览器存储信息的一种方式,服务器可以响应浏览器set-cookie标头, 浏览器收到这个标头与数值后,会将它以文件的形式存储在计算机上,这个文件 就称之为Cookie。一个常见的应用,自动登录。 Cookie可以设定存活期限,所以在客户端存储的信息可以活得更久一些。 Servlet本身提供了创建、设置与读取Cookie的API。如果你要创建Cookie,可以 使用Cookie类,创建时指定Cookie中的名称与数值,并使用HttpServletResponse 的addCookie()方法在响应中新增Cookie。 例:Cookie cookie = new Cookie("user","caterpillar"); cookie.setMaxAge(7*24*60*60);//单位是秒 response.addCookie(cookie); HTTP中Cookie的设定是通过set-cookie标头,所以必须在实际响应浏览器之前 使用addCookie()来新增Cookie实例,在浏览器输出HTML响应之后再运行 addCookie()是没有作用的。 要取得浏览器上存储的Cookie,则可以从HttpServletRequest的getCookies()来取 得,这可取得属于该网页所属域(Domain)的所有Cookie,返回值是Cookie[] 数组。取得Cookie对象后,可以使用Cookie的getName()与getV alue()方法,分 别取得Cooke的名称与数值。 例:Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie cookie : cookies){ String name = cookie.getName(); String value = cookie.getV alue(); ........ } }
用Servlet 进行文件上传的原理和实现 Servlet 是用 Java 编写的、协议和平台都独立的服务器端组件,使用请求/响应的模式,提供了一个基于 Java 的服务器解决方案。使用 Servlet 可以方便地处理在 HTML 页面表单中提交的数据,但 Servlet 的 API 没有提供对以 mutilpart/form-data 形式编码的表单进行解码的支持,因而对日常应用中经常涉及到到文件上传等事务无能为力。 如何用 Servlet 进行文件的上传,必须编程实现。 一、基本原理 通过 HTML 上载文件的基本流程如下图所示。 浏览器端提供了供用户选择提交内容的界面(通常是一个表单),在用户提交请求后,将文件数据和其他表单信息编码并上传至服务器端,服务器端(通常是一个 cgi 程序)将上传的内容进行解码了,提取出 HTML 表单中的信息,将文件数据存入磁盘或数据库。 二、各过程详解 A)填写表单并提交
通过表单提交数据的方法有两种,一种是 GET 方法,另一种是 POST 方法,前者通常用于提交少量的数据,而在上传文件或大量数据时,应该选用 POST 方法。在 HTML 代码中,在