servlet 总结.md
关于Servlet的学习概要:
tomcat 安装 、环境配置
servlet概念 ,配置servlet到web.xml中,生命周期,乱码问题
方法:init(), service()、 doGet()、 doPost(), destory()
request、response、servletcontext、Servletconfig
重定向、转发、Cookie技术、Session技术
1、什么是Sevlet?
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。简答来说就是用来连接客户端与服务器之间的数据交互
2、有什么作用?
可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页 ,在mvc模式中属于Control控制层。
3、生命周期:
由容器控制,如,tomcat,经过初始化、运行和销毁三个阶段。值得注意的是,servlet是单实例,多线程,存在线程安全问题,所以,一定不要在sevlet中定义或修改成员变量。不管有多少请求客户,servlet都只进行一次初始化,并在初始化的时候调用一次init()函数,之后,为每一个客户端的请求创建一个新的线程。而且,不要把sevlet手动修改为单线程,这样会严重影响网络访问,因为在同一个时刻,只能有一个线程可以访问。可以用下面的程序,验证他是单实例,多线程:
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;
public class TestLifeCycleServlet extends HttpServlet {
public TestLifeCycleServlet() {
System.out.println("--------TestLifeCycleServlet()----------");
}
public void init()
throws ServletException {
System.out.println("-----------init-------------");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("------------doGet-------------");
}
public void destroy() {
}
}
-
初始阶段 init():
1.servlet容器加载servlet类,把servlet类的.class文件独到内存
2.容器创建ServletConfig对象,该对象包含了servlet的初始化信息
3.容器创建一个servlet对象,调用对象的int方法进行初始化。 -
运行阶段 service():
当容器接到客户端的请求的时候,会创建servletRequest和servletResponse对象,然后调用service方法,并把这两个参数传进去。不管是通过doGet(参数放到请求的头,故有长度限制)还是doPost方法处理请求(参数放到请求体中,故无长度限制),都是由service方法来处理的。servletResponse获得请求的信息,servletResponse返回处理后的信息。
-
销毁阶段 destory():
因为只有一个实例,所以只进行一次销毁,调用的是destroy方法,将servlet对象和相关联的servletConfig对象也一并销毁。我们可以在destroy方法中,添加一些释放资源的方法,这样会提高系统的性能。如,关闭连接,关闭流的输出等。
4、Servlet处理请求:
不管是否基于mvc模式,servlet处理请求主要是基于servletRequest和servletResponse对象的。在mvc模式中,为达到职责单一的目的,采用了转发和重定向的思想。
重定向:是将处理到一定程度的数据回发给客户端后,再次建立一次新的请求,上次请求中request对象中的数据信息不会保留,是两次请求两次响应,可以跨项目。
转发:只发生在服务端,客户端是不知道的,不涉及重新发送请求的问题,所以数据不会被冲刷掉, 是一次请求一次响应,不能跨项目;
因为重定向不会共享request对象,可以将request对象的数据放到session中,解决这种不足,下面是转发和重定向的代码实现:
servlet类中的代码:
StudentManager studentManager = new StudentManagerImpl();
List<Student> studentList = studentManager.findStudnetList(beginDate,endDate);
//将学生列表设置到request范围中
request.setAttribute("student_list",studentList);
//转发:在服务端转发,客户端是不知道的
request.getRequestDispatcher("/student_list.jsp").forward(request,response);
//将studentList放到session中
//HttpSession session =request.getSession();
//session.setAttribute("student_list",studentList);
//重定向,不会共享request,request.getContextPath()用于获取当前目录到跟目录的路径
//response.sendRedict(request.getContextPath()+"/student_list.jsp");
//以下写法错误,/代表8080端口,或者可以理解成跟目录
//response.sendRedict("/studentList.jsp");
处理视图显示的jsp的与之对应的代码:
List <Student> studentList =(List) request.getAttribute("student_list");
//如果servlet使用的是session,那么这里就要对应成session
//List <Student> studentList =(List) session.getAttribute("student_list");
5、servlet和jsp的区别:
我们知道jsp通过容器的管理最后编译成servlet类,同样也是运行在服务端的,但是jsp更加侧重处理与界面相关的一些显示。当然也避免不了与一些后台数据的交互,这时候就引入了jsp中嵌入java代码的语法:
####1.如果使用<!% %>作为全局变量出现,用于定义成员变量:
<%!
int i;
public void setName(){....};
%>
####2.如果使用<% %>作为局部变量出现,用于定义某个方法的一些变量等:
<%
List <Student> studentList =(List) request.getAttribute("student_list");
//如果servlet使用的是session,那么这里就要对应成session
//List <Student> studentList =(List) session.getAttribute("student_list");
for (Iterator<Student> iter = studentList.iterator();iter.hasNext();){
Student student = iter.next();
}
%>
####3.如果使用<%= %>=后面必须是字符串变量或者可以被转换成字串的表达式,不需要以分号结束,只有一行:
<td><%=student.getStudentId()%></td>
<td><%=student.getStudentName()%></td>
####4.注释:
<% //.....%>
<% --.......--%>
<% /*.....*/%>
六、Servlet的Cookie、Session:
重点:
Session 是单用户的会话状态。当用户访问网站时,产生一个 SESSIONID,并存在于 COOKIES 中。每次向服务器请求时,发送这个 COOKIES ,再从服务器中检索是否有这个 SESSIONID 保存的数据。
cookie ,则是服务器端的缓存,是所有用户都可以访问和共享的。通常为网页及媒体文件,在涉及安全性的动态生成页面上,可以设置有较短时间,以便减少攻击。
操作:
获取Cookie : request . getCookie()
获取name :Cookie对象 . getName()
获取value :Cookie对象 . getValue()
创建cookie : Cookie cookie = new Cookie("name","value")
发送 Cookie 到 HTTP 响应头:response . addCookie(Cookie对象)
设置Cookie的值: Cookie对象 . setValue(”值“)
设置生命周期: Cookie对象. setMaxAge(int seconds)
void setPath(String uri) 该方法设置 cookie 适用的路径;
如果您不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie
cookie和ssession都是保存每个用户单独的信息,前者保存在服务器。安全。后者保存在客户端。安全比较低。后者可以长期保存。在客户端浏览器和服务器之间来回丢来丢去。
七、Sevlet过滤器:
1、过滤器的作用:
1.判断用户是否登录
2.过滤非法字符
3.解决统一编码
2、过滤器的使用:
是一个实现了Filter接口的java类,重写init、doFilter、destroy方法,在web.config文件中可以配置多个过滤器,
它们按照顺序执行,并具有传递性。
八、Servlet的监听器:
是对request、session、application的监听。通过监听,可以增加系统的安全性,手动的添加一些资源的处理,
可以增强系统的性能。
如,若要创建一个对session的监听,需要实现HttpSessionListener接口,重写下面的方法:
public void sessionCreated(HttpSessionEvent arg0) {} // 创建
public void sessionDestroyed(HttpSessionEvent arg0) {} // 销毁
public void attributeAdded(HttpSessionEvent arg0) {} // 增加
public void attributeRemoved(HttpSessionEvent arg0) {} // 删除
public void attributeReplaced(HttpSessionEvent arg0) {} // 替换
可以根据这张图回忆一下servlet的具体内容,更容易掌握