处理请求,生成响应.
3>继承javax.servlet.http.HttpServlet
方式一代码(实现servlet接口):
package com.jyh.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class AServlet implements Servlet {
private ServletConfig config;
public void init(ServletConfig arg0) throws ServletException {
this.config = arg0;
System.out.println("调用init方法");
}
public void service(ServletRequest arg0, ServletResponse arg1)
throws ServletException, IOException {
arg1.getWriter().print("hello word!");
System.out.println("调用service方法");
}
public void destroy() {
System.out.println("调用destroy方法");
}
public ServletConfig getServletConfig() {
return config;
}
public String getServletInfo() {
return null;
}
}
2> 使命 ==> service方法 ,当请求发来时,处理请求使用.
3> 销毁 ==> destory方法, 当服务器关闭时,会销毁servlet,在销毁之前调用该方法释放资源.
getServletConfig ==> 返回servletConfig对象.
4>getServletContext
创建继承servlet方式二(继承javax.servlet.GenericServlet)
package com.jyh.servlet;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public abstract class MyGernericServlet implements Servlet, ServletConfig {
private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
init();
}
//该重载方法是给继承该类的人重写所用,因为初始化方法必须要初始化config
//为了避免重写init方法的人没有初始化config,所以重载了init方法
public void init() {
}
//由于service是处理请求响应的地方,所以将service声明成抽象方法,让继承该类的人去实现
public abstract void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
/*
* 将ServletConfig对象中的四个方法单独抽离出来
*/
public String getServletName() {
return getServletConfig().getServletName();
}
public String getInitParameter(String name) {
return getServletConfig().getInitParameter(name);
}
public Enumeration getInitParameterNames() {
return getServletConfig().getInitParameterNames();
}
public ServletContext getServletContext() {
return getServletConfig().getServletContext();
}
public ServletConfig getServletConfig() {
return config;
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
package com.jyh.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public abstract class MyHttpServlet extends MyGernericServlet {
private final String Http_GET = "GET";
private final String Http_POST = "POST";
//因为JavaWeb项目大多数都是基于Http协议的
//所以将request和response对象强转成HttpServletRequest和HttpServletResponse
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest httpReq = null;
HttpServletResponse httpRes = null;
try{
httpReq = (HttpServletRequest) req;
httpRes = (HttpServletResponse) res;
}catch(ClassCastException e){
throw new ServletException("异常");
}
service(httpReq, httpRes);
}
//根据请求方式调用不同的方法
public void service(HttpServletRequest httpReq, HttpServletResponse httpRes)
throws ServletException, IOException {
String method = httpReq.getMethod();
if(method.equals(Http_GET)){
doGet(httpReq,httpRes);
}else if(method.equals(Http_POST)){
doPost(httpReq,httpRes);
}
}
public void doPost(HttpServletRequest httpReq,HttpServletResponse httpRes) {
}
public void doGet(HttpServletRequest httpReq,HttpServletResponse httpRes) {
}
}
3>关于Servlet路径配置问题
设项目名为MyServlet
ServletContext对象
1.获得: servletConfig.getServletContext
2.servletContext 的作用
1> servletContext 封装了web.xml 中的配置
getInitParameterNames(); ==> 获得所有键
getInitParameter(key); ==> 根据键获得对应的值
2> servlet技术中3大域对象之一.
ServletContext对应着Application(应用)域.利用了一个项目中只有一个ServletContext实例的特点.在servletContext中放置了一个map用作数据通信.
这个Map就是所谓域.
关于域的操作,有4个.
放入键值对 setAttribute(key,value)
通过键取值 getAttribute(key)
通过键删除 removeAttribute(key)
遍历所有键 getAttributeNames()
3>获得项目中资源.
所有servletContext中关于路径的获得,相对路径都是相对的 WebRoot(项目根)下
getRealPath ==> 通过相对路径获得绝对路径
getResourceAsStream ==> 根据相对路径获得指定资源流
3.servlet技术中对象的范围
servlet ==> 项目启动期间一个servlet只有一个servlet实例
request ==> 项目启动期间,request对象的数量,要看当前有多少个请求正在处理.
response ==> 同上.
servletConfig ==> 一个servlet实例对应一个servletConfig对象
servletContext ==> 整个项目中,永远只有一个servletContext实例存在.
类加载器获得资源和路径
一:使用getClass().getResourceAsStream方法获得资源,相对路径分为两种情况
1: 加"/" ==> 相对的是classes目录
2: 不加"/" ==> 相对的是本类当前目录也就是src目录
InputStream is = this.getClass().getResourceAsStream("students.xml");
System.out.println(is);
二:使用this.getClass().getClassLoader().getResourceAsStream("");获得资源
只有一个相对路径 ==> 就是相对于 classes目录
InputStream is2 = this.getClass().getClassLoader().getResourceAsStream("students.xml");
System.out.println(is2);
注意: 使用类和类加载器加载资源文件时
1 getClassLoader()原本是用来加载.class文件的, 所以缓存设计的很小.不要用他加载一些别较大的资源.
2 jvm运行期间只加载一次. 但是使用下面的代码可以解决这个问题(不获取资源,只获取路径).
String path = this.getClass().getClassLoader().getResource("students.xml").getPath();
File file = new File(path.substring(1, path.length()));
System.out.println(path);