-----------------------------android培训、java培训、期待与您交流!----详细请看:http://edu.youkuaiyun.com/heima---------------
1. JavaServlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet可完成如下功能:
– 创建并返回基于客户请求的动态HTML页面。
– 创建可嵌入到现有HTML 页面中的部分HTML 页面(HTML片段)。
–与其它服务器资源(如数据库或基于Java的应用程序)进行通信
2. 每一个Servlet都必须要实现Servlet接口,GenericServlet是个通用的、不特定于任何协议的 Servlet,它实现了 Servlet 接口,而HttpServlet继承于GenericServlet,因此HttpServlet也实现了Servlet接口,所以我们定义的Servlet只需要继承HttpServlet父类即可。
3. Servlet接口中定义了一个service 方法,HttpServlet 对该方法进行了实现,实现方式就是将ServletRequest 与ServletResponse转换HttpServletRequest与HttpServletResponse
4. 在该service方法中,首先获得到请求的方法名,然后根据方法名调用对应的doXXX方法,比如说请求方法为GET,那么就去调用doGet方法;请求方法为POST,那么就去调用doPost方法。
5. 在 HttpServlet 类中所提供的doGet、doPost等方法都是直接返回错误信息,所以我们需要在自己定义的 Servlet类中 override这些方法
6. ServletRequest接口中封装了客户请求信息,如客户请求方式、参数名和参数值、客户端正在使用的协议,以及发出客户请求的远程主机信息等 。
ServletRequest接口还为Servlet提供了直接以二进制方式读取客户请求数据流的ServletInputStream。
7. ServletRequest接口的主要方法:
•getAttribute 根据参数给定的属性名返回属性值
•getContentType 返回客户请求数据MIME类型
•getInputStream 返回以二进制方式直接读取客户请求数据的输入流
•getParameter 根据给定的参数名返回参数值
•getRemoteAddr 返回远程客户主机的IP地址
•getRemoteHost 返回远程客户主机名
•getRemotePort 返回远程客户主机的端口
8. ServletResponse 接口为Servlet提供了返回响应结果的方法。它允许Servlet设置返回数据的长度和MIME类型,并且提供输出流ServletOutputStream。
9. ServletResponse接口的主要方法:
•getOutputStream 返回可以向客户端发送二进制数据的输出流对
象ServletOutputStream
•getWriter 返回可以向客户端发送字符数据的PrintWriter对象
•getCharacterEncoding 返回Servlet发送的响应数据的字符编码
•getContentType 返回Servlet发送的响应数据的MIME类型
•setContentType 设置Servlet发送的响应数据的MIME类型
10. Servlet初始化阶段: 在下列时刻Servlet容器装载Servlet:
–Servlet容器启动时自动装载某些Servlet
–在Servlet容器启动后,客户首次向 Servlet发出请求
– Servlet的类文件被更新后,重新装载Servlet
Servlet被装载后,Servlet容器创建一个Servlet 实例并且调用 Servlet 的 init()方法进行初始化。在Servlet的整个生命周期中,init方法只会被调用一次。
11. Servlet响应客户请求阶段:对于到达Servlet容器的客户请求,Servlet容器创建特定于这个请求的ServletRequest对象和ServletResponse对象,然后调用Servlet 的 service方法。service方法从ServletRequest对象获得客户请求信息、处理该请求,并通过ServletResponse对象向客户返回响应结果。
1. 某些Servlet 在 web.xml 文件中只有<servlet>元素而没有<servlet-mapping>元素,这样我们就无法通过url 地址的方式访问这个Servlet 了,这种 Servlet 通常会在<servlet>元素中配置一个<load-on-startup>子元素,让容器在启动的时候自动加载该Servlet,并且调用其init方法完成一些全局性的初始化工作。
2. ServletContext和Web应用关系:ServletContext就是JSP内置对象Appriaction它的类型。
当Servlet容器启动Web应用时,并为每个Web应用创建惟一的ServletContext对象。你可以把ServletContext看成是一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,它提供了读取或设置共享数据的方法:
–setAttribute(Stringname,Object object)把一个对象和一个属性名绑定,将这个对象存储在ServletContext中。
–getAttribute(String name)根据给定的属性名返回所绑定的对象
3. 创建CounterServlet: CounterServlet在ServletContext中存放了一个count属性:
计数器:
(一):ServletContextcontext = getServletContext();
// 从ServletContext读取count属性
Integercount = (Integer)context.getAttribute("count");
if ( count== null ) {
count = new Integer(0);
context.setAttribute("count",new Integer(0));
}
// 创建新的count对象,其值增1
count = newInteger(count.intValue() + 1);
// 将新的count属性存储到ServletContext中
context.setAttribute("count",count);
(二):ServletContextcontext = req.getSession().getServletContext();
if(null ==context.getAttribute("counter"))
{
context.setAttribute("counter",1);
}
else
{
intcounter= (Integer)context.getAttribute("counter");
context.setAttribute("counter",counter + 1);
}
req.getRequestDispatcher("counter.jsp").forward(req,resp);//转发到页面上显示。
}
4. Servlet的多线程同步问题:Servlet是单实例的,因为单实例的,所有线程共享同一个实例里面的成员变量。实例里面进行了写操作。
这样当有多个用户同时访问某个 Servlet时,会访问该唯一的 Servlet实例中的成员变量,如果对成员变量进行写入操作,那就会导致 Servlet的多线程问题,即数据不一致。
5. 解决Servlet 多线程同步问题的最好方案:(1)去除实例变量,使用局部变量(2) 使用同步代码块:synchronized{…}
6. Cookie:
一个Cookie包含一对Key/Value。下面的代码生成一个Cookie并将它写到用户的硬盘上:
Cookie theCookie=new Cookie("cookieName","cookieValue");
response.addCookie(theCookie);
7. 在JSP上写Cookie: <body>中
<%! int count1 = 0;
int count2 = 0;
%>//先进行声明
<%Cookie cookie = new Cookie("cookieName" + count1++,"cookieValue" + count2++);
cookie.setMaxAge(15);//单位是秒,并不是毫秒.
response.addCookie(cookie);
%>
<%
Cookie[] cookies = request.getCookies();
if(null== cookies)
{
return;
}
for(Cookiec : cookies)
{
%>
<p>
<b>cookiename: </b> <%= c.getName() %><br>
<b>cookie value: </b><%=c.getValue() %>
</p>
<%} %>
8. 比较Servlet和JSP:
1 )有许多相似之处,都可以生成动态网页 JSP的优点是擅长于网页制作,生成动态页面,比较直观。
2) JSP的缺点是不容易跟踪与排错。
3) Servlet是纯Java语言,擅长于处理流程和业务逻辑。Servlet的缺点是生成动态网页不直观。
练习:
问题:HttpServletRequest对象是由谁创建的?
由Servlet容器负责创建,对于每个HTTP请求, Servlet容器都会创建一个HttpServletRequest对象.JavaWeb应
用并不创建Servlet,由Servlet容器会管理JavaWeb应用.
问题:ServletContext对象是由谁创建的?//( 调用ServletContext对象的getAttribute()方法).
由Servlet容器负责创建,对于每个JavaWeb应用,在启动时,Servlet容器都会创建一个ServletContext对象,
对于每个HTTP请求,共享 Servlet容器都会创建的同一个ServletContext对象
问题:分析ServletRequest、ServletResponse Servlet、ServletContext等对象的生命周期何时被创建,何时被销毁?
ServletRequest、ServletResponse请求来了创建,响应过去消毁.
Servlet 自己创建的.
ServletContext服务器启动的时侯,重启时.
问题:jspForward1.jsp要把请求转发给jspForward2.jsp,应该在jspForward1.jsp中如何实现?
<jsp:forward page=“jspForward2.jsp”>
问题:jspForward1.jsp要把请求转发给jspForward2.jsp,在转发的时候,希望把用户名 “小新”传给jspForward2.jsp,如何实现?
request.setAttribute(“username”, “小新”);
问题:request.getAttribute()和request.getParameter()方法有什么异同?
选项有:
前者返回Object类型的对象,后者返回String类型的对象
request.getAttribute()和request.setAttribute()对应
当两个Web组件之间为链接关系时,被链接的组件通过getParameter()方法来获得请求参数//超链接中的关系
当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。//请求转发.
request.getParameter()方法传递的数据,会从Web客户端传到Web服务器端,代表HTTP请求数据。
request.setAttribute()和getAttribute()方法传递的数据只会存在于Web容
器内部,在具有转发关系的Web组件之间共享。
-----------------------------android培训、java培训、期待与您交流!----详细请看:http://edu.youkuaiyun.com/heima---------------