http协议
超文本传输协议,规定了客户端和web服务器进行通信的标准语言,是一种无状态的协议,所以需要session和cookie记录信息
表单html
<from action="" name="" method=""></from>
参数action:决定请求交由哪个action处理
参数name:标识名称
method:请求的方式,post,get
post:一样用于更新信息,把提交的数据放置在是HTTP包的包体中,一般我们提交表单使用的方法为post
get:一般用于获取数据,请求的数据会附在URL之后(就是把数据放置在请求行(request line)中),以?分割URL和传输数据,多个参数用&连接;那么传输数据就会受到URL长度的限制,且不如post安全,信息会被大家看见
Web容器
也叫servlet容器,用来执行servlet网页,流程是客户端发起一个http请求--http请求包含要处理的网页名称--web服务器向web容器寻求动态网页--web容器将执行环境设定好并加载相应的页面--执行结果转换成html给客户端
servlet网页以实例的方式加载到内存中,而且只会加载一次,单例模式,那么多个浏览器请求这个网页,web容器会为各个请求建立一条线程,存取相同的servlet实例
servlet使用Java EE的函数库,一个servlet的的生命周期会经历三个方法:
init()方法:被设计成只调用一次。它在第一次创建 Servlet 时被调用,用于 Servlet的初始化,初始化的数据,可以在整个生命周期中使用
service方法:执行实际任务的主要方法。 Servlet 容器(Tomcat、Jetty等)调用 service() 方法来处理来自客户端(浏览器)的请求,并把相应结果返回给客户端
destory方法:只会被调用一次,在 Servlet 生命周期结束时调用
ServletContext对象
存储在servletcontext对象的参数可供该context目录的所有servlet网页存取
提供setAttribute()方法和getAttribute()方法
ServletConfig对象
没有设置属性的方法,只供该servlet网页存取初始参数
如下,配置web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- servlet_context name 配置项目起始参数及值 该项目目录下的所有servlet网页使用 -->
<context-param>
<param-name>contentType</param-name>
<param-value>text/html;charset=UTF-8</param-value>
</context-param>
<servlet>
<servlet-name>Servlet01</servlet-name>
<servlet-class>xidian.lili.servletConfigContext.Servlet01</servlet-class>
<!-- servlet起始参数,仅供该servlet网页(Servlet1)使用 -->
<init-param>
<param-name>parameter</param-name>
<param-value>Servlet1's parameter</param-value>
</init-param>
</servlet>
<servlet>
<servlet-name>Servlet02</servlet-name>
<servlet-class>xidian.lili.servletConfigContext.Servlet02</servlet-class>
<init-param>
<param-name>parameter</param-name>
<param-value>Servlet2's parameter</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Servlet01</servlet-name>
<url-pattern>/servlet01</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Servlet02</servlet-name>
<url-pattern>/Servlet02</url-pattern>
</servlet-mapping>
</web-app>
创建Servlet01
package xidian.lili.servletConfigContext;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet01 extends HttpServlet{
String parameter,contentType,bookName;
/**
* 根据servlet名称获取ServletConfig对象
* 根据ServletContext名称获取servletContext对象
*/
public void init(){
ServletConfig config=getServletConfig();
parameter = config.getInitParameter("parameter");
ServletContext context=getServletContext();
contentType=context.getInitParameter("contentType");
context.setAttribute("bookname", "Java JVM");
bookName=context.getAttribute("bookname").toString();
}
public void doGet(HttpServletRequest rq,HttpServletResponse rp) throws IOException{
rp.setContentType(contentType);//设定输出格式
PrintWriter out=rp.getWriter();
out.println("<html>");
out.println("<head><title>Servlet01</title></head>");
out.println("<body>");
out.println("<h3>ServletConfig</h3>");
out.println("<h3>Parameter value:</h3>"+parameter);
out.println("<h3>ServletContext</h3>");
out.print("<h3>书名: </h3>"+bookName);
out.println("</html>");
out.close();
}
public void doPost(HttpServletRequest rq,HttpServletResponse rp) throws IOException{
this.doGet(rq, rp);
}
}
创建Servlet02,有myeclipse自己创建
package xidian.lili.servletConfigContext;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Servlet02 extends HttpServlet {
String parameter,contentType,bookName;
public void doGet(HttpServletRequest rq,HttpServletResponse rp) throws IOException{
rp.setContentType(contentType);//设定输出格式
PrintWriter out=rp.getWriter();
out.println("<html>");
out.println("<head><title>Servlet01</title></head>");
out.println("<body>");
out.println("<h3>ServletConfig</h3>");
out.println("<h3>Parameter value:</h3>"+parameter);
out.println("<h3>ServletContext</h3>");
out.print("<h3>书名: </h3>"+bookName);
out.println("</html>");
out.close();
}
public void doPost(HttpServletRequest rq,HttpServletResponse rp) throws IOException{
this.doGet(rq, rp);
}
/**
* Initialization of the servlet. <br>
*
* @throws ServletException if an error occurs
*/
public void init() throws ServletException {
ServletConfig config=getServletConfig();
parameter = config.getInitParameter("parameter");
ServletContext context=getServletContext();
contentType=context.getInitParameter("contentType");
bookName=context.getAttribute("bookname").toString();
}
}
结果:
可以看到放到ServletContext的对象所有servlet共享
HttpSession对象
专门用来存放同一个客户端的东西,所以允许跨网页存取该对象的属性,当多个用户连接到web服务器上,就会产生很多HttpSession对象,用Session ID来区分,一般session ID会存放在客户端的Cookie中,客户端没有打开cookie,不能使用session,所以:
Session是在服务端保存的一个数据结构,用来跟踪用户的状态,这个数据可以保存在集群、数据库、文件中;
Cookie是客户端保存用户信息的一种机制,用来记录用户的一些信息,也是实现Session的一种方式