package 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 MyServlet implements Servlet{
/*servlet在第一次请求时由服务器创建实例并调用生命周期方法,其余的比较有用的方法(比如:getServletConfig)会在生命周期方法中做调用
* servlet也可以在服务器启动时创建,servlet的创建可以在web.xml中的servlet中<load-on-startup>0</load-on-startup>配置,
* 其中数值越小优先级越高。之所以配置是
* 由于第一次创建servlet要完成的工作比较多,所以一般都是在启动服务器时就要求创建servlet,防止第一次请求耗时
*
* 生命周期方法,由服务器调用:
* init(有参),service(),destroy()
* init(有参):完成初始化工作,只调用一次
* service():处理请求,没请求一次就调用一次
* destroy():服务器关闭之前调用,只调用一次
*/
/*servlet有三大域:ServletContext,HttpServletRequest,HttpSession
*
*jsp有九大内置对象(内置对象一般在jsp中能够直接使用,但是有特例:exception和session),
*exception:在errorPage页面的isErrorPage属性为true时,才会被使用即抛出500异常
*session:HttpSession,也是有属性限制,不过默认为true,可以直接使用.
*out:输出流
*request:HttpServlet,
*response:HttpResponse
*application:整个应用程序,真身是ServletContext
*config:真身是ServletConfig
*page:当前jsp对象 object page = this;
*pageContext:一个顶九个
*
*四大域:在不同servlet之间传递数据,具备存取数据功能,类似Map集合,以键值对形式存取数据
*application域:applicationScope
*对应ServletContext,一个项目只能有一个,与服务器共生死,方法:setAttribute(),getAttribute(),removeAttribute()
*也能获取资源路径
*request域:requestScope,请求链
*session域:sessionScope一个用户的会话
*page域:pageScope,真身是pageContext,一个jsp页面和页面中标签共享数据,可以获取其他8个内置对象,因为可以通过方法获取其他内置对象。并代理其他域,即可以获取其他域中的数据
*因为方法中多了getAttribute(String name, int scope)等一系列方法scope其他域的字段,甚至可以全域查找
*
*
*三大组件:
*filter
*listen
*servlet
*
*三大指令:
*page
*
*include:静态包含,将本页面和被包含的页面在运行之前进行合并成一个jsp页面,再又服务器转为.java和.class文件(一个servlet)
*
*taglib:导入标签库
*两个属性:
*prefix:制定标签在本页面的前缀,本页面使用自定义标签库中的标签的前缀必须加上该前缀
*uri:自定义标签库的位置
*格式:<%@taglib prefix="s" uri="/.."%> 比如使用标签库中的a标签:<s:a>
*
*
*jsp动作标签:
*<jsp:include>:动态包含,运行时进行结果合并,文件并不会合并相当于方法调用,由服务器解释和执行,相当于RequestDispatcher.include();
*<jsp:forward>:转发,由服务器解释和执行,相当于RequestDispatcher.forward();
*<jsp:param>:参数,向动态包含和转发的页面传参数
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("我是destroy。。。。");
}
//ServletConfig对应web.xml中的一个servlet配置信息
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
System.out.println("我是ServletConfig.....");
return null;
}
//servlet的信息描述
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
System.out.println("我是getServletInfo。。。。。");
return "";
}
//完成初始化工作,ServletConfig参数是由服务器传进来的,可以拿来进行初始化
@Override
public void init(ServletConfig config) throws ServletException {
config.getServletContext().setAttribute("name", "我是共享数据");
System.out.println("我是init。。。。");
}
//处理请求,一般是抽象方法,为了让子类必须重写该方法,为了处理不同的用户请求,GenericServlet接口在实现servlet接口时就重写为了抽象方法
@Override
public void service(ServletRequest arg0, ServletResponse arg) throws ServletException, IOException {
// TODO Auto-generated method stub
/*GenericServlet实现的是Servlet接口,HttpServlet继承的是GenericServlet
*
* GenericServlet中的service(ServletRequest,ServletResponse)方法是抽象方法
* 需要HttpServlet重写,在重写的service(ServletRequest,ServletResponse)方法中
* 调用自己本类中的service(HttpServletRequest,HttpServletResponse),而
* service(HttpServletRequest,HttpServletResponse)方法会判断请求信息是doGet还是doPost,在调用与之对应的doGet或者
* doPost,所以service(HttpServletRequest,HttpServletResponse)方法不需要子类重写,只需要重写doGet()和doPost()
*
* (这两个方法不是抽象方法,有默认内容)
* 如果没有复写doGet()和doPost()方法,,doGet()和doPost()默认的回应就是405错误,即不支持该请求方式
*
* HttpServlet的service(ServletRequest,ServletResponse)方法:
* HttpServletRequest request = (HttpServletRequest)servletRequest;
* HttpServletResponse response = (HttpServletResponse)servletResponse;
* service(request,response);//HttpServlet自己的方法,由生命周期方法调用比较重要的其他方法,子类重写的方法在被调用时会先加载父类的,由父类的生命周期方法调用其它方法
*
*/
System.out.println("我是service。。。。");
}
}