servlet小结
1.servlet容器和servlet的功能?
servlet容器
1)可以创建Servlet,并可以调用Servlet的相关生命周期的方法。
2)Jsp,Filter,Listener,Tag..都是由Servlet容器创建,并可以调用相关生命周期的方法。
Servlet可以完成以下功能:
1)创建并返回基于客户请求的动态HTML页面
2)创建可嵌入到现有HTML页面中的部分HTML页面
3)与其他服务器资源(数据库或者基于java的应用程序)进行通信
2.创建servlet的过程
1)创建一个Servlet的接口的实现类
2)在web.xml进行映射
<!--配置和映射servlet-->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>ff</servlet-name>
<!-- servlet的全类名 -->
<servlet-class>cn.itcast.service.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致 -->
<servlet-name>ff</servlet-name>
<!-- 映射具体的访问的虚拟路径:/代表当前web的根目录 -->
<url-pattern>/hello.s</url-pattern>
</servlet-mapping>
3.Servlet容器
1)可以创建Servlet,并可以调用Servlet的相关生命周期的方法。
2)Jsp,Filter,Listener,Tag..都是由Servlet容器创建,并可以调用相关生命周期的方法。
4.Servlet生命周期的方法 -- 以下方法都是由servlet容器负责调用
1)构造器:只有第一次请求Servlet时,创建Servlet的实例,调用构造器。
这说明Servlet是单实例的.
2)init():只调用一次,在创建好实例后立即被调用,用于初始化当前Servlet。
创建构造器也是初始化。而init(ServletConfig arg0)有ServletConfig类的作用
3)service():被多次调用,每次请求都会调用service方法,实际用于响应请求。
4)destory():只调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源。
5.load-on-startup 参数
1)配置在servlet节点中
<!--配置和映射servlet-->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>ff</servlet-name>
<!-- servlet的全类名 -->
<servlet-class>cn.itcast.service.HelloServlet</servlet-class>
<!-- 可以指定servlet被创建的时期 -->
<load-on-startup>1</load-on-startup> <!--1表示在加载WEB应用时就初始化servlet 调用构造器和init-->
</servlet>
2)load-on-startup:可以指定servlet被创建的时机,
若为负数,则在第一次请求时被创建。
若为0或者正数,则在web应用被servlet容器加载时创建实例(没有发送请求),且数值越小越早被创建.
service()方法只有在发送请求时才会被调用
6.关于servlet-mapping
1)一个servlet下的servlet-name可以有多个<servlet-mapping>与之对应
2)在servlet映射道德URL中也可以使用*通配符,但是只有2中固定的格式
一种格式是"*.扩展名",另一种格式是"/*"结尾
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致 -->
<servlet-name>ff</servlet-name>
<!-- 映射具体的访问的虚拟路径:/代表当前web的根目录 -->
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致 -->
<servlet-name>ff</servlet-name>
<!-- 映射具体的访问的虚拟路径:/代表当前web的根目录 -->
<url-pattern>*.html</url-pattern>
</servlet-mapping>
注意带扩展名的不能加/ 比如/*.html不合法
<servlet-mapping>
<!-- 需要和某一个servlet节点的servlet-name子节点的文本节点一致 -->
<servlet-name>ff</servlet-name>
<!-- 映射具体的访问的虚拟路径:/代表当前web的根目录 -->
<url-pattern>/*.action</url-pattern>
</servlet-mapping>
7.ServletConfig:分装了Servlet的配置信息,还可以操作ServletContext
1)配置servlet的初始化参数
<init-param>必须在<load-on-startup>前面
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>ff</servlet-name>
<!-- servlet的全类名 -->
<servlet-class>cn.itcast.service.HelloServlet</servlet-class>
<!--配置servlet初始化参数-->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<!-- 可以指定servlet被创建的时期 -->
<load-on-startup>-1</load-on-startup>
</servlet>
2)获取初始化参数:
java.lang.String getInitParameter(java.lang.String name) :获取指定参数的初始化参数
java.util.Enumeration<java.lang.String> getInitParameterNames() :获取参数名的Enumeration
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>ff</servlet-name>
<!-- servlet的全类名 -->
<servlet-class>cn.itcast.service.HelloServlet</servlet-class>
<!--配置servlet初始化参数-->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<!-- 可以指定servlet被创建的时期 -->
<load-on-startup>-1</load-on-startup>
</servlet>
@Override
/*
HelloServlet初始化
root
wjc user
*/
public void init(ServletConfig servletConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("HelloServlet初始化");
System.out.println(servletConfig.getInitParameter("user"));
Enumeration<String> x = servletConfig.getInitParameterNames();
while(x.hasMoreElements()){
System.out.println("wjc "+x.nextElement());
}
}
3)获取servlet的名字
java.lang.String getServletName() :获取servlet的名字
<!--配置和映射servlet-->
<servlet>
<!-- servlet注册的名字 -->
<servlet-name>ff</servlet-name>
<!-- servlet的全类名 -->
<servlet-class>cn.itcast.service.HelloServlet</servlet-class>
<!--配置servlet初始化参数-->
<init-param>
<!-- 参数名 -->
<param-name>user</param-name>
<!-- 参数值 -->
<param-value>root</param-value>
</init-param>
<!-- 可以指定servlet被创建的时期 -->
<load-on-startup>-1</load-on-startup>
</servlet>
System.out.println(servletConfig.getServletName());//ff
8.ServletContext
1)可以由servletConfig获取
ServletContext getServletContext()
2)该对象代表当前WEB应用:可以认为ServletContext是当前WEB应用的一个大管家,可以从中获取到当前WEB应用的各个方面的信息
由于一个WEB应用程序中的所有Servlet都共享一个ServletContext对象,所以ServletContext对象被称为application对象(WEB应用程序的对象)
①获取当前WEB应用的初始化参数
<!-- 配置当前WEB应用的初始化参数 -->
<context-param>
<param-name>gg</param-name>
<param-value>kk</param-value>
</context-param>
<context-param>
<param-name>gg</param-name>
<param-value>kk</param-value>
</context-param>
///获取ServletContext对象
ServletContext context = servletConfig.getServletContext();
System.out.println(context.getInitParameter("gg"));//kk
Enumeration<String> y = context.getInitParameterNames();
/*
kkk ggx
kkk gg
*/
while(y.hasMoreElements()){
System.out.println("kkk "+y.nextElement());
}
②获取当前WEB应用的某一文件的绝对路径 -->一个文件在服务器上的绝对路径 而不是物理路径
//D:\mysoftware\eclipse32_workspace\demo-servlet\WebContent\a.txt(物理路径)
String realPath = context.getRealPath("/a.txt");
//D:\software\apache-tomcat-8.0.52\webapps\demo-servlet\a.txt(服务器上的绝对路径 )
System.out.println(realPath);
仨、获取当前WEB应用的名称
//获取当前WEB应用的名称
String contextPath = context.getContextPath();
System.out.println(contextPath); -- (WEB应用) (/demo-servlet)
④、获取当前WEB应用的某一个文件对应的输入流
java.io.InputStream getResourceAsStream(java.lang.String path) path的/为当前WEB应用的根目录.
try {
ClassLoader classLoader = getClass().getClassLoader();
InputStream in = classLoader.getResourceAsStream("jdbc.properties");
System.out.println("1. "+in);//1. java.io.BufferedInputStream@945083
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
InputStream in2 = context.getResourceAsStream("jdbc.properties");
System.out.println("2. "+in2);//2. null
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
InputStream in2 = context.getResourceAsStream("/WEB-INF/classes/jdbc.properties");
System.out.println("3. "+in2);//3. java.io.ByteArrayInputStream@9676fc
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
五、和attribute相关的几个方法
void setAttribute(java.lang.String name, java.lang.Object object)
void removeAttribute(java.lang.String name)
9.WEB应用的初始化参数和servlet初始化参数
servlet初始化参数:局部变量 只有当前配置servlet初始化参数的servlet可以应用
WEB应用的初始化参数:全局变量 所有的servlet都可以应用
ServletRequest小结
1)如何在Servlet中获取请求信息
1)Servlet的service()方法用于应答请求;因为每次请求都会调用service()方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
// TODO Auto-generated method stub
}
ServletRequest:分装了请求信息,可以从中获取到任何请求的信息
ServletResponse:封装了响应信息,如果想给用户啥响应,具体可以用该接口的方法实现
上面的ServletRequest和ServletResponse在服务器调用service()方法时进行实现的
2)ServletRequest方法
①.获取请求参数
java.lang.String getParameter(java.lang.String name):根据参数名返回参数值
若请求参数有多个值(例如 checkbox ),该方法只能获取第一个值
user:<input type="text" name="user"/><br>
password:<input type="password" name="pwd"/>
String name = req.getParameter("user");
String pwd = req.getParameter("pwd");
System.out.println(name+"-----"+pwd);
java.lang.String[] getParameterValues(java.lang.String name):根据请求参数名,返回请求参数对应的字符串数组(适用于checkbox)
<input type="checkbox" name="ins" value="x"/>x
<input type="checkbox" name="ins" value="y"/>y
<input type="checkbox" name="ins" value="k"/>k
String [] d = req.getParameterValues("ins");
for(String x: d){
System.out.println(x);
}
java.util.Enumeration<java.lang.String> getParameterNames() :返回参数名对应的Enumeration对象,类似于servletConfig(或者ServletContext)
Enumeration<String> en = req.getParameterNames();
while(en.hasMoreElements()){
System.out.println(en.nextElement());
}
java.util.Map<java.lang.String,java.lang.String[]> getParameterMap() :返回请求参数的键值对 key:参数名 value:参数值(String数组类型)
/*
user-----[weu]
pwd-----[e3rt]
ins-----[x, k]
*/
Map<String,String[]> map = req.getParameterMap();
Set<Entry<String, String[]>> set= map.entrySet();
for(Entry<String, String[]> h:set){
System.out.println(h.getKey()+"-----"+Arrays.asList(h.getValue()));
}
②获取请求url
一切请求的东西都可以通过HttpServletRequest对象获得
HttpServletRequest是ServletRequest的子接口
//获取url
HttpServletRequest rd = (HttpServletRequest) req;//要进行强转
System.out.println(rd.getRequestURI());// (/demo-servlet/login.x)
//获取请求方式
String m = rd.getMethod();
System.out.println(m);//POST
//获取get的传递参数和值 就是?号后面的
String k = rd.getQueryString();
System.out.println(k);// (user=sdf&pwd=wert&ins=x)
//获取请求的Servlet的映射路径
System.out.println(rd.getServletPath());// (/login.x)
3)、HttpServletRequest:是ServletRequest的子接口。针对于Http请求所定义的,里面包含大量HTTP请求方法
4)ServletResponse:封装了响应信息,如果想给用户啥响应,具体可以用该接口的方法
java.io.PrintWriter getWriter():调用该对象的print方法,将吧print()中的参数打印到用户的浏览器上
PrintWriter pw = res.getWriter();
pw.println("hgyutrhd");
void setContentType(java.lang.String type):设置响应的内容形式
PrintWriter pw = res.getWriter();
pw.println("hgyutrhd");
//使用wrold形式进行响应
res.setContentType("application/msword");
pw.print("swedrftghy");
5)HttpServletResponse是ServletResponse的子接口
void sendRedirect(java.lang.String location) :响应重定向
GenericServlet小结
1.GenericServlet
public abstract class GenericServlet implements Servlet, ServletConfig, java.io.Serializable
1)是一个Servlet.是Servlet接口和ServletConfig接口的实现类.但是一个抽象类。其中的service为抽象方法
2)如果新建的Servlet继承GenericServlet会使开发简介
3)具体实现
1-在GenericServlet中声明了一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行初始化
2-利用ServletConfig成员变量的方法实现了ServletConfig接口的方法
3-还定义了一个init()方法,在init(ServletConfig arg0)方法中对其进行调用,子类可以直接覆盖父类的init()方法在其中实现对servlet的初始化
4-不建议直接覆盖init(ServletConfig arg0)方法,应为如果忘了super(ServletConfig),而还是调用ServletConfig得方法就会出现空指针异常,因为
ServletConfig变量没有进行初始化,就会出现NullPointException
package cn.itcast.service;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.GenericServlet;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* 自定义的Servlet接口的是实现类 让开发的任何的Servlet都继承该类
* @author Administrator
*/
public abstract class MyGenericConfig implements Servlet,ServletConfig {
private ServletConfig sconfig;
/** Servlet的方法 **/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return sconfig;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
sconfig = arg0;
this.init();
}
@Override
public void init() throws ServletException {
// NOOP by default
}
@Override
public abstract void service(ServletRequest req, ServletResponse res) throws ServletException, IOException;
/** ServletConfig的方法 **/
@Override
public String getInitParameter(String arg0) {
// TODO Auto-generated method stub
return sconfig.getInitParameter(arg0);
}
@Override
public Enumeration<String> getInitParameterNames() {
// TODO Auto-generated method stub
return sconfig.getInitParameterNames();
}
@Override
public ServletContext getServletContext() {
// TODO Auto-generated method stub
return sconfig.getServletContext();
}
@Override
public String getServletName() {
// TODO Auto-generated method stub
return sconfig.getServletName();
}
}
HttpServlet小结
HttpServlet -- 在GenericServlet基础上增加了doGet和doPost()方法还增加了其他一些方法
如doHead()
public abstract class HttpServlet extends GenericServlet
1)是一个Sevlet,继承自GenericServlet,针对与HTTP协议所制定
2)在service()方法中直接将ServletRequest和ServletResponse转化为HttpServletRequest和HttpServletResponse
并且调用了重载的service();(service(HttpServletRequest req, HttpServletResponse resp))
3)在service(HttpServletRequest req, HttpServletResponse resp)获取请求方式:req.getMethod()
if("get".equalsIgnoreCase(method)){
doGet(req,res);
}
if("post".equalsIgnoreCase(method)){
doPost(req,res);
}
4)好处直接有针对性的覆盖doXXX()方法,直接作用于HttpServletRequest和HttpServletResponse
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_get_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String protocol = req.getProtocol();
String msg = lStrings.getString("http.method_post_not_supported");
if (protocol.endsWith("1.1")) {
resp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg);
} else {
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, msg);
}
}
package cn.itcast.service;
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;
/**
* 自己定义的HttpServlet增加了doGet和doPost方法
* @author Administrator
*
*/
public class MyHttpServlet extends MyGenericConfig {
@Override
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest) req;
response = (HttpServletResponse) res;
} catch (ClassCastException e) {
throw new ServletException("non-HTTP request or response");
}
service(request, response);
}
public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
String method = req.getMethod();
if("get".equalsIgnoreCase(method)){
doGet(req,res);
}
if("post".equalsIgnoreCase(method)){
doPost(req,res);
}
}
protected void doPost(HttpServletRequest req, HttpServletResponse res) {
// TODO Auto-generated method stub
}
protected void doGet(HttpServletRequest req, HttpServletResponse res) {
// TODO Auto-generated method stub
}
}