1.Servlet 的 HelloWorld
1).创建一个Servlet 接口的实现类
public class FirstServlet implements Servlet
2).在web.xml文件中配置和映射这个Servlet
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>just.another.test.FirstServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
2.Servlet 容器:运行Servlet、JSP、Filter 等的软件环境。
1).可以来创建Servlet,并调用Servlet 的相关生命周期方法。
2).JSP,Filter,Listener,tag...
3.Servlet 生命周期的方法:以下方法都由Servlet 容器负责调用。
1).构造器:只被调用一次,只有第一次请求Servlet 时,创建Servlet 的实例,调用构造器
这说明Servlet 是单实例的!
2).init方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前的Servlet。
3).service:被多次调用,每次请求都会调用Servlet方法,实际用于响应请求。
4).destroy:只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet 所占用的资源。
5.load-on-startup 参数:
1).配置在Servlet节点中
2).可以指定Servlet被创建的时机,若为负数,则在第一次请求时被创建,若为0或正数,则在当前WEB应用被
Servlet 容器加载时创建实例,且数值越小越早被创建。
6.ServletConfig:封装了Servlet 的配置信息,并且可以获取ServletContext对象
1).配置Servlet的初始化参数
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>just.another.test.FirstServlet</servlet-class>
<!-- 配置Servlet 的初始化参数。且节点必须在load-on-startup节点前面 -->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>1230</param-value>
</init-param>
<load-on-startup>-1</load-on-startup>
</servlet>
2).获取初始化参数:
getInitParameter(String name):获取指定参数名的初始化参数
getInitParameterNames():获取参数名组成的Enumeration 对象
String user = servletConfig.getInitParameter("user");
System.out.println("user:"+user);
Enumeration<String> names = servletConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name=names.nextElement();
String value=servletConfig.getInitParameter(name);
System.out.println(name+":"+value);
}
3).获取Servlet 的配置信息(了解)
7.ServletContext
1).可以由ServletConfig 获取
2).该对象代表当前WEB应用:可以认为ServletContext是当前WEB应用的一个大管家,可以从中获取到当前WEB应用的各个方面的信息。
①.获取当前WEB应用的初始化参数
设置初始化参数:可以为所有的Servlet 所获取,而Servlet 的初始化参数只能当前Servlet 可以获取
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
方法:
getInitParameter(String name)
getInitParameterNames()
②.获取当前WEB应用的某一个文件在服务器上的绝对路径,而不是部署前的路径
getRealPath(String path);
③.获取当前WEB应用的名称:
getContextPath
④.获取当前WEB应用的某一个文件的输入流:
getResourceAsStream(String path):path 的/相当于当前WEB应用的根目录
8.如何在Servlet中获取信息:
1).Servlet的service()方法用于应答请求:因为每次请求都会调用service()方法
public void service(ServletRequest request, ServletResponse response)
throws ServletException, IOException
ServletRequest:封装了请求信息,可以从中获取到任何的请求信息.
ServletResponse:封装了响应信息,如果想给用户什么响应,均可以使用该接口的方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入
2).ServletRequest:封装了请求信息,可以从中获取到任何的请求信息.
①.获取请求参数:
>String getParameter(String name):根据请求参数的名字,返回参数值
若请求参数有多个值(例如 checkbox),该方法只能获取到第一个提交的值
>String[] getParameterValues(String name):根据请求参数的名字,返回请求参数的字符串数组
>Map getParameterMap():返回请求参数的键值对:key:参数名,value:参数值,String 数组类型
>Enumeration geyParameterName():返回参数名对应的Enumeration 对象
类似于ServletConfig(或 ServletContext)的getInitParameterNames()方法
②.获取请求的URL:
HttpServletRequest httpServletRequest=(HttpServletRequest)request;
String requestURL = httpServletRequest.getRequestURI();
③.获取请求方式:
String method = httpServletRequest.getMethod();
④.若是一个GET请求,获取请求 参数对应的那个字符串,即?后的那个字符串
String queryString=httpServletRequest.getQueryString();
⑤.获取请求Servlet的映射路径
String servletPath = httpServletRequest.getServletPath();
⑥.和attribute相关的几个方法
3).HttpServletRequest:是ServletRequest 的子接口,针对HTTP请求所定义,里面包含了大量获取HTTP请求相关的方法
4).ServletResponse:封装了响应信息,如果想给用户什么响应,均可以使用该接口的方法实现。
①.getWriter():返回PrintWriter 对象,调用对象的print()方法,将把print()中的参数直接打印到客户的浏览器上。
②.设置响应的内容类型:response.setContentType("application/msword");
③.void sendRedirect(String location):请求重定向.(此方法为HTTPServletResponse 中定义.)
-----------------------------------------------------------------------------------------------
在web.xml中设置两个WEB应用的初始化参数,user,password.
定义一个login.html,里边定义两个请求字段:user,password,发送请求到loginServlet
再创建一个loginServlet,在其中获取请求的user,password,此对其和web.xml文件中定义的参数是否一致
若一致,响应Hello:xxx,若不一致,响应Sorry:xxx xxx为user。
-----------------------------------------------------------------------------------------------
1.GenericServlet:
1).是一个Servlet,是Servlet 接口和ServletConfig 接口的实现类,但是是一个抽象类,其中service方法为抽象方法
2).如果新建的Servlet 程序直接继承GenericServlet 会使开发更简洁
3).具体实现:
①.在GenericServlet 中声明了一个ServletConfig 类型的成员变量,在init(ServletConfig)方法中对其进行了初始化
②.利用servletConfig 成员变量的方法实现了ServletConfig 接口的方法
③.还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖init()在其中实现对Servlet的初始化
④.不建议直接覆盖init(ServletConfig),因为如果忘记编写super.init(ServletConfig),而还使用了ServletConfig接口的方法,则会出现空指针异常
⑤.新建的init()方法并非Servlet的生命周期方法,而init(ServletConfig)是生命周期相关的方法。
2.HttpServlet
1).是一个Servlet,继承GenericServlet,针对于HTTP协议所制定
2).在service()方法中直接把ServletRequest 和 ServletResponse 转为 HTTPServletRequest 和 HttpServletResponse
并调用了重载的service(HttpServletRequest,HttpServletReponse)
在 service(HttpServletRequest,HttpServletReponse) 获取了请求方式:request.getMethod().根据请求方式又创建了
doXxx()方法(xxx 为具体的请求方式,比如doGet,doPost)
3).实际开发中,直接继承HttpServlet,并根据请求方式复写doXxx()方法接口
4).好处:直接由针对性的覆盖doXxx()方法;直接使用HttpServletRequest 和 HttpServletResponse,不在需要强转