javaWeb之Servlet小结

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35654259/article/details/86350715

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
		
	}
}
  

猜你喜欢

转载自blog.csdn.net/qq_35654259/article/details/86350715