JSP/Servlet笔记
一、Servlet简介
Servlet程序可以运行于任何服务器,如web、email、FTP等,所有servlet程序必须实现javax.servlet接口。GenericServlet是实现了javax.servlet接口的抽象类,其定义了servlet生命周期、初始化参数等方法,具有和应用层协议无关的特性,GenericServlet是所有servlet程序的父类,而我们只要求其运行在HTTP服务器上,可以通过继承GenericServlet子类HttpServlet就可以实现。
1、Web Application
Web Application包含WEB-INF和META-INF两部分,可以直接放在Tomcat的webapp下运行,也可以通过配置文件指定到其他目录。特别的:WEB-INF文件夹下的网页用户无法访问。
//Wen Application目录结构 WEB-INF web.xml web app的配置文件 lib web app的库文件 classes 存放编译好的servlet META-INF 存放web app的上下文信息,符合J2EE标准 //server.xml配置内容 <Context docBase="目录位置" path="虚拟路径" reloadable="true" debug="0"/>
2、开发环境搭建
(1)配置jar包和web.xml
Dynamic Web project项目建立成功后, 第一步需要添加jar包,servlet程序依赖的servlet-api.jar包位于Tomcat的lib目录,需复制该jar包到项目的lib目录下,并【add to bulid path】加入到运行环境中。第二步需在新建web.xml文件中并配置如下信息:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <!-- 欢迎页 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
(2)编写代码
import java.io.*; import javax.servlet.http.*; public class FirstServlet extends HttpServlet { // doGet方式参数在传递过程中,在URL地址中显示出来 @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) { //设置文档类型,使Html标签不被作为纯文本输出 response.setContentType("text/html;charset=UTF-8"); String name = request.getParameter("name"); PrintWriter pw = null; try { pw = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } pw.println(name+":HelloWord!"); } // doPost方式参数在传递过程中,在URL地址中隐藏了 @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) { // 不用重复代码,可以直接调用doGet方法 doGet(request, response); } }
(3)URL拦截配置
<servlet> <servlet-name>FirstServlet</servlet-name> <servlet-class>FirstServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>FirstServlet</servlet-name> <url-pattern>/FirstServlet</url-pattern> </servlet-mapping>
(4)运行结果
3、Servlet生命周期
servlet对象只在初次访问时进行一次实例化和初始化,再次访问不会再new处对象,等到程序结束时,调用destroy方法终止程序。在非分布的情况下,通常一个servlet在服务器中只有一个实例。
public class FirstServlet extends HttpServlet { // ① 加载: ClassLoader // ② 实例化,调用构造方法实例化对象,只执行一次 public FirstServlet(){ System.out.println("constructor"); } // ③ 初始化,只在对象第一次初始化时执行一次 @Override public void init(ServletConfig config) throws ServletException { System.out.println("init"); } // ④ 处理请求,容器自动调用service方法,执行doGet或doPost @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("doGet"); } // ⑤ 退出服务,destroy只在程序停止时调用 @Override public void destroy() { System.out.println("destroy"); } }
二、请求与响应
1、请求处理方法
//分别对应HTTP协议的7中请求
doGet 响应Get请求
doPost 响应POST请求
doPut 用于http1.1协议
doDelete 用于http1.1协议
doHead 仅响应Get请求的头部,可用于比较页面是否已经被获取过,避免二次获取
doOptions 用于http1.1协议
doTrace 用于http1.1协议
2、request请求
(1)读取单个参数
String name = request.getParameter("name");
(2)读取全部参数
//① 获取表单中所有的具有name属性.返回一个Enumeration类型的枚举 Enumeration paramNames = request.getParameterNames(); while (paramNames.hasMoreElements()) { //② 获取控件 name String paramName = (String) paramNames.nextElement(); //③ 根据name获取value值 String[] paramValues = request.getParameterValues(paramName); // 当value只有一个值时 if (paramValues.length == 1) { String paramValue = paramValues[0]; if (paramValue.length() == 0) { System.out.print("值为null"); } else { System.out.print(paramValues); } // 当value有多个值时 } else { for (int i = 0; i < paramValues.length; i++) { System.out.print(paramValues[i]); } }
System.out.println(); }
3、response响应
// 设置文档类型 response.setContentType("text/html;charset=utf-8"); PrintWriter pw = response.getWriter(); pw.println("<!DOCTYPE html>"); pw.println("<html>"); pw.println("<head>"); pw.println("<title>生成动态网页</title>"); pw.println("</head>"); pw.println("<body>"); pw.println("</body>"); pw.println("</html>");
四、会话控制
1、Cookie
2、Session