Servlet:
Java类必须符合一定的规范:
- a.必须继承 javax.servlet.http.HttpServlet
- b.重写其中的 doGet()或doPost()方法
- doGet(): 接受 并处 所有get提交方式的请求
- doPost():接受 并处 所有post提交方式的请求
Servlet要想使用,必须配置
Serlvet2.5:web.xml
Servle3.0: @WebServlet
Serlvet2.5:web.xml:
项目的根目录:WebContent 、src
<a href="WelcomeServlet">所在的jsp是在 WebContent目录中,因此 发出的请求WelcomeServlet 是去请求项目的根目录。
Servlet流程:
请求 -><url-pattern> -> 根据<servlet-mapping>中的<servlet-name> 去匹配 <servlet> 中的<servlet-name>,然后寻找到<servlet-class>,求中将请求交由该<servlet-class>执行。
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="WelcomeServlet">WelcomeServlet</a><br/>
<form action="/WelcomeServlet" method="post">
<input type="submit" >
</form>
</body>
</html>
WelcomeServlet
package b1;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WelcomeServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("doPost...");
this.doGet(req, resp);
}
}
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>WelcomeServlet</servlet-name>
<servlet-class>b1.WelcomeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>WelcomeServlet</servlet-name>
<url-pattern>/WelcomeServlet</url-pattern>
</servlet-mapping>
</web-app>
2个/:
jsp:/ localhost:8888
web.xml: / http://localhost:8888/项目名/
1.回顾纯手工方法创建第一个Servlet
步骤:
- 编写一个类,继承HttpServlet
- 重写doGet()、doPost()方法
- 编写web.xml 中的servlet映射关系
2.借助于Eclipse快速生成Servlet
直接新建Servlet即可!(继承、重写、web.xml 可以借助Eclipse自动生成)
Servlet3.0,与Servlet2.5的区别:
Servlet3.0不需要在web.xml中配置,但 需要在 Servlet类的定义处之上编写 注解@WebServlet("url-pattern的值")
匹配流程: 请求地址 与@WebServlet中的值 进行匹配,如果匹配成功 ,则说明 请求的就是该注解所对应的类
3. /
项目根目录:WebContent、src(所有的构建路径)
例如:
WebContent中有一个文件index.jsp
src中有一个Servlet.java
如果: index.jsp中请求 <a href="abc">...</a> ,则 寻找范围:既会在src根目录中找 也会在WebContent根目录中找
如果:index.jsp中请求<a href="a/abc"></a>,寻找范围:先在src或WebContent中找a目录,然后再在a目录中找abc
- web.xml中的 /:代表项目根路径——————http://localhost:8888/Servlet25Project/
- jsp中的/: 服务器根路径——————http://localhost:8888/
构建路径、WebContent:根目录
4.Servlet生命周期:5个阶段
- 加载
- 初始化: init() ,该方法会在 Servlet被加载并实例化的以后 执行
- 服务 :service() ->doGet() doPost
- 销毁 :destroy(), Servlet被系统回收时执行
- 卸载
init():
a.默认第一次访问 Servlet时会被执行 (只执行这一次)
b.可以修改为 Tomcat启动时自动执行
i.Servlet2.5: web.xml
<servlet>
...
<load-on-startup>1</load-on-startup>
</servlet>
其中的“1”代表第一个。
ii.Servlet3.0
@WebServlet( value="/WelcomeServlet" ,loadOnStartup=1 )
service()
->doGet() doPost :调用几次,则执行几次
destroy()
关闭tomcat服务时,执行一次。
package org.lanqiao.servlet;
import java.io.IOException;
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 WelcomeServlet extends HttpServlet{
@Override
public void init() throws ServletException {
System.out.println("init...");
//获取当前Servlet的初始化参数
String value = super.getInitParameter("servletparamname") ;
System.out.println("当前Servlet的参数servletparamname的值是:"+value);
//获取当前Web容器的初始化参数
ServletContext servletContext = super.getServletContext() ;
String globalValue = servletContext.getInitParameter("globalParam") ;
System.out.println("当前Web容器的 参数globalValue的值是:"+globalValue);
}
@Override
public void destroy() {
System.out.println("destroy....");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service的具体实现(doGet...doPost..)...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("doPost...");
this.doGet(req, resp);
}
}
5 Servlet API :
由两个软件包组成: 对应于HTTP协议的软件包、对应于除了HTTP协议以外的其他软件包
即Servlet API可以适用于 任何 通信协议。
我们学习的Servlet,是位于javax.servlet.http包中的类和接口,是基础HTTP协议。
6.Servlet继承关系
ServletConfig:接口
- ServletContext getServletContext():获取Servlet上下文对象 application
- String getInitParameter(String name):在当前Servlet范围内,获取名为name的参数值(初始化参数)
a.ServletContext中的常见方法(application):
- getContextPath():相对路径
- getRealPath():绝对路径
- setAttribute() 、getAttribute()
- String getInitParameter(String name);在当前Web容器范围内,获取名为name的参数值(初始化参数)
Servlet3.0方式 给当前Servlet设置初始值:
@WebServlet( .... , initParams= {@WebInitParam(name="serveltparaname30",value="servletparavalue30") } )
注意,此注解只 隶属于某一个具体的Servlet ,因此无法为 整个web容器设置初始化参数 (如果要通过3.0方式设置 web容器的初始化参数,仍然需要在web.xml中设置)
HttpServletRequest中的方法:(同request),例如setAttrite()、getCookies()、getMethod()
HttpServletResponse中的方法:同response
Servlet使用层面: