servlet

Posted 未名胡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了servlet相关的知识,希望对你有一定的参考价值。

本节简单介绍servlet,对于监听器、过滤器等在后面的一些章节将会讲到,这里不多介绍

目录:

    |--Servlet的简单介绍

           |--什么是servlet?

           |--servlet的工作流程

           |--servlet接口的方法

           |--实现servlet的方式

           |---实例1

    |--request、response

           |--request

           |--response

    |--ServletConfig

    |--ServletContext

    |--GenericServlet

    |--HttpServlet

    |--处理表单

----------------------------------------------------------------------------------------------------------------------------------------------------------------

Servlet的简单介绍                                                                                                                                                                          

什么是Servlet?

首先在web开发程序应用中,我们应用程序所有的请求和响应都是由Servlet完成。也就是Servlet是在界面和数据库交换服务的中心。

比如:表单提交 <--xml--> Servlet <---service---> 数据库(不考虑三层架构)

Servlet的工作流程

浏览器------(HTTP协议)------(Tomcat接收并解析,封装成HttpServletRequest类型的request对象)---->Servlet(Service方法(与数据库交换数据))---HttpServletResponse类型的response对象)---->浏览器


Servlet接口的常用方法:

先介绍下servlet的生命周期:

   Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动派遣运行与请求对应的doXXX方法(doGet,doPost)等,
    当服务器决定将实例销毁的时候调用其destroy方法。

生命周期的方法(前三)

1.init():Servlet的被创建后,就会调用void init(ServletConfig)方法,只调用一次,servlet的初始化

2.service():请求处理方法,接收浏览器出入来的数据,然后进行处理,返回数据给浏览器等等;

                    ----void service(HttpServletRequest request,HttpServletResponse response)

                   因为servlet都会应用HTTP协议传输,所以在这里就写HttpServletRequest,HttpServletResponse而没写ServletRequest,ServletResponse

3.destory():servlet的销毁--void init(ServletConfig config) throws ServletException

                       --void destory()

4.getServletConfig():对象对应web.xml文件中的<servlet>元素;对象是由服务器创建的,然后传递给Servlet的init()方法,可以在init()方法中使用它!

                                       --ServletConfig getServletConfig()

5.getServletInfo():返回servlet的描述,获取网页的说明信息;如:作者、版本、版权

                                  --java.lang.String.getServletInfo()

实现Servlet的方式

①实现javax.servlet.Servlet接口

②继承javax.servlet.GenericServlet类

③继承javax.servlet.http.HttpServlet类:开发中使用

实例:

/**
 * 第一个Servlet实例
 * @author hulin
 *
 */
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
@WebServlet(name="ServletDemo1",urlPatterns={"/servletDemo"})
//@WebServlet注解类型是声明一个Servlet。name代表servlet的名称,urlPatterns则是调用servlet的路径
public class ServletDemo1 implements Servlet {
	private transient ServletConfig servletConfig;//transient这个已经在java的修饰符中说过,使得servletConfig只能在声明周期内调用
	@Override
	public ServletConfig getServletConfig() {
		return servletConfig;
	}
	@Override
	public String getServletInfo() {	
		return "ServletDemo1";
	}
	@Override
	public void init(ServletConfig arg0) throws ServletException {
		this.servletConfig=servletConfig;		
	}
	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		String servletName=servletConfig.getServletName();
		response.setContentType("text/html");
		PrintWriter writer=response.getWriter();
		writer.print("<html><head></head>"+"<body>Hello from"+servletName+"/<body></html>");	
	}
	@Override
	public void destroy(){
		
	}
}

request、response                                                                                                                                                               

request:                                                                                                                                                                                                       

定义:

HttpServletRequest对象,获取浏览器请求数据,并传给service方法,由于后面都是应用到HttpServletRequest,所以这里的request是以HttpServletRequest对象来讲的

方法:获取的请求信息

1.String getParameter(String paramName):获取指定请求参数的值

2.Enumeration getParameterNames():获取所有参数的名字

3.String[] getParameterValues(String name):当多个参数名称相同时,可以使用方法来获取

4.Map getParameterMap():获取所有参数封装到Map中,其中key为参数名,value为参数值,因为一个参数名称可能有多个值,所以参数值是String[],而不是String。

5.void setCharacterEncoding(String encoding):设置post方法请求体的编码;4.这个方法必须在调用getParameter()方法之前调用!因为要获取数据后才能转码

6.Cookie[] getCookies():返回一个Cookie数组

7.HttpSession getSession():返回与这个请求有关的session对象。如果没有找到,则创建新的session对象

8.HttpSession getSession(boolean create):返回与这个请求有关的session对象。如果没有找到,并且creat参数为true,那么将创建新的session

9.String getMethod():获取请求方法,例如get或post

10.String getHeader(String name):获取指定请求头的值

11.Enumeration getHeaderNames():获取所有请求头名称

12.String getContentType():获取请求类型,如果请求是GET,那么这个方法返回null;如果是POST请求,那么默认为application/x-www-form-urlencoded,

13.Locale getLocale():返回当前客户端浏览器的Locale

14.String getContextPath():返回上下文路径,例如:/hello;/项目名

15.String getQueryString():返回请求URL中的参数,例如:name=zhangSan

16.String getRequestURI():返回请求URI路径,例如:/hello/oneServlet

17.StringBuffer getRequestURL():返回请求URL路径,例如:http://localhost/hello/oneServlet,即返回除了参数以外的路径信息

18.String getServletPath():返回Servlet路径,例如:/oneServlet

19.String getRemoteAddr():返回当前客户端的IP地址

20.String getRemoteHost():返回当前客户端的主机名,但这个方法的实现还是获取IP地址

21.String getScheme():返回请求协议,例如:http

22.String getServerName():返回主机名,例如:localhost

23.int getServerPort():返回服务器端口号,例如:8080

24.getContentType():返回请求主体的MIME类型,如果不知道类型,则返回null

25.getProtocol():返回这个HTTP请求的协议名称和版本号

request是域对象

request是一个域对象,可以把它当成Map来添加获取数据

域方法:

1.void setAttribute(String name, Object value)

2.Object getAttribute(String name)

3.void removeAttribute(String name)

4.Enumeration getAttributeNames()

请求转发

定义:当浏览器请求A,但是A没有处理,把请求直接在服务器内部转给B。对浏览器来说,并不知道有请求转发的存在,浏览器地址栏也不会有任何的变化

格式:RequestDispatcher rd = request.getRequestDispatcher("/qpp.jsp").forward(request,response);

重定向与请求转发的区别:

请求转发 可以看地址栏,重定向地址栏会发生改变,而请求转发没有改变。重定向所带的数据不能被共用,请求转发可以共用

response                                                                                                                                                                                                             

定义:HttpServletResponse对象response完成对客户端的响应工作

方法:

1.PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);

2.void setCharacterEncoding(String encoding):设置输出的字符的编码,比如:在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,则response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;

3.void setHeader(String name, String value):向客户端添加响应头信息,例如setHeader(“Refresh”, “3;url=http://www.qpp.com”),表示3秒后自动刷新到http://www.qpp.com;

4.void setContentType(String contentType):该方法是setHeader(“content-type”, “xxx”)的简便方法;例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;

5.void addCookie(Cookie cookie):将cookie发送到浏览器

6.void addHeader(String name,String value):给这个响应对象添加标头

7.void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:response(404, “您要查找的资源不存在!”)

8.ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片;

重定向

定义:访问A servlet的时候,A Servlet无法处理,然后告诉浏览器个浏览器去重新访问B Servlet的。这就是重定向response.sendRedirect("/B Servlet");

格式:response.sendRedirect("http://www.qpp.com");

注意:

    重定向是两次(至少)请求

    重定向就不要再使用response.getWriter()或response.getOutputStream()输出数据,不然可能会出现异常

实例:

jsp:

  <form action="wlecome" method="post">
   用户名:<input type="text" name="username" /></br>
   <input type="radio" name="testRadio" value="man">男</br>
   <input type="radio" name="testRadio" value="woman">女</br>
   <input type="submit" value="提交" />
   </form>
web.xml

<servlet>

      <servlet-name>welcome</servlet-name>//我们定义的servlet应用名字

      <servlet-class>cn.hulin.servlet.WelcomeServlet</servlet-class>//我们定义的servlet应用名字对应的具体servlet文件

</servlet>

<servlet-mapping>  //地址映射

      <servlet-name>welcome</servlet-name>//我们定义的servlet应用名字

      <url-pattern>/demo</url-pattern>//地址名

</servlet-mapping>

servlet:

public class WlecomeServlet implements Servlet {
    public void service(ServletRequest request, ServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
        String username=request.getParameter("username");
        String radio = request.getParameter("testRadio");
        out.print(radio+"");
        out.print(username);
        out.flush();
    }
}
ServletConfig                                                                                                                                                                                           
定义:在Servlet容器初始化Servlet时,Servlet容器将ServletConfig传给Servlet的init方法,ServletConfig封装可以通过@WebServlet或者部署描述符传给一个Servlet的配置信息。
方法:
1.getInitParameter():

       |--this.config.getInitParameter("value");获得配置文档中<init-param>标签下name对应的value

       |-- String charset = this.config.getInitParameter("charset");获得字符集编码

       |--String configFile = this.config.getInitParameter("config");获取配置文件

       |--获得数据库连接信息,在框架配置中用到

           |--String url = this.config.getInitParameter("url");

           |--String username = this.config.getInitParameter("username");

           |--String password = this.config.getInitParameter("password");

2.getServletContext():利用这个方法从Servlet内部获取ServletContext

实例

/**
 * ServletConfig实例
 * @author hulin
 *
 */
@WebServlet(name="ServletConfigDemo",urlPatterns={"/servletConfigDemo"},
			initParams={
				@WebInitParam(name="admin",value="hulin"),
				@WebInitParam(name="email",value="[email protected]")
				}
)
public class ServletConfigDemo implements Servlet {
	private transient ServletConfig servletConfig;
	
	@Override
	public ServletConfig getServletConfig() {
		return servletConfig;
	}
	@Override
	public String getServletInfo() {
		return "ServletCofig demo";
	}

	@Override
	public void init(ServletConfig arg0) throws ServletException {
		this.servletConfig=servletConfig;
		
	}
	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		ServletConfig servletConfig=getServletConfig();
		String admin=servletConfig.getInitParameter("admin");
		String email=servletConfig.getInitParameter("email");
		response.setCharacterEncoding("text/html");
		PrintWriter writer=response.getWriter();
		writer.print("<html><head></head><body>"+"Admin:"+admin+"<br/>Email:"+email+"</body></html>");
	}
	@Override
	public void destroy() {
	}
}
ServletContext                                                                                                                                                                                         
定义:ServletContext表示Servlet应用程序。每个Web应用程序只有一个context。
            在ServletConfig中调用getServletContext()方法可以获取ServletContext。
            ServletContext域对象,在开发中经常用application对象来表示;
            代表当前对象,是共享的;也就是比如在聊天室中,每个人都能看得见信息;
            要知道的是ServletContext对象的创建是在服务器启动时完成的,销毁是在服务器关闭时完成的

怎么获取ServletContext域?

            HttpSession.getServletContext()

            我们也可以用别的域然后让域里面的数据显示共享,也可以再调用ServletContext();比如:session.ServletContext(...);

方法

1.void setAttribute(String name, Object value):用来存储一个对象,如:servletContext.setAttribute(“xxx”, “XXX”);域属性名称为xxx,域属性的值为XXX

2.Object getAttribute(String name):用来获取存在ServletContext中的数据,如:String value = (String)servletContext.getAttribute(“xxx”);,获取名为xxx的域属性

3.void removeAttribute(String name):用来移除ServletContext中的域属性

4.Enumeration getAttributeNames():获取所有域属性的名称

5.File  getRealPath():获取当前文件路径

实例:

web.xml

  <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql:///test</param-value>
    </context-param>

    <context-param>
        <param-name>username</param-name>
        <param-value>root</param-value>
    </context-param>
    <context-param>
        <param-name>root</param-name>
        <param-value>123</param-value>
    </context-param>
servlet
public class ServletContextDemo3 extends HttpServlet {
   public void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      //获取全局变量
      ServletContext context = getServletContext();
      Enumeration enumer = context.getInitParameterNames();
      //打印
      while (enumer.hasMoreElements()) {
         System.out.println("全局变量:"+context.getInitParameter((String)enumer.nextElement()));
      }
   }
   public void doPost(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      doGet(request, response);
   }
}
GenericServlet                                                                                                                                                                                           
定义:GenericServlet是抽象类,实现了Servlet和ServletConfig;
            通过在init方法中将ServletConfig对象赋给一个类级变量servletConfig,实现对ServletConfig的保存

工作步骤:

①将init方法中的ServletConfig赋给一个类级变量,使它可以通过调用getServletConfig来获取。
②为Servlet接口中的所有方法提供默认实现。
③提供方法来包装ServletConfig中的方法。ServletConfig servletConfig=getServletConfig();

实例:对在ServleConfig实例的简化

/**
 * 对之前的ServletConfigDemo实例的修改
 * @author hulin
 *
 */
@WebServlet(name="ServletConfigDemo",urlPatterns={"/servletConfigDemo"},
initParams={
	@WebInitParam(name="admin",value="hulin"),
	@WebInitParam(name="email",value="[email protected]")
	}
)
public class GenericServletDemo extends GenericServlet{
	private static final long serialVersionUID=6250089L;
	@Override
	public void service(ServletRequest request, ServletResponse response)
			throws ServletException, IOException {
		ServletConfig servletConfig=getServletConfig();
		String admin=servletConfig.getInitParameter("admin");
		String email=servletConfig.getInitParameter("email");
		response.setCharacterEncoding("text/html");
		PrintWriter writer=response.getWriter();
		writer.print("<html><head></head><body>"+"Admin:"+admin+"<br/>Email:"+email+"</body></html>");
	}
}
HttpServlet                                                                                                                                                                                                 
定义:

浏览器要通过HTTP协议进行传输,所以在Servlet的编程中,大部分都要用到HTTP。

HttpServlet类覆盖了上面所说的GenericServlet类,使用的是HttpServletRequest和HttpSerevletResponse对象

处理HTML表单                                                                                                                                                                                           

HTML输入域(文本域、隐藏域或密码域)或者文本域的值被当做一个字符串发送到服务器。

对于空白的输入域或者文本域将发送一条空白的字符串。因此,带有一个输入域名称的ServletRequest.getParameter将永远不会反回null

------------

HTML的select元素还会给标头发送一个字符串。

如果没有选择select元素中的任何选项,那么将会发送所显示的选项值。

对于一个带有多个值得选择元素,必须由ServletRequest.getParameterValues进行处理


以上是关于servlet的主要内容,如果未能解决你的问题,请参考以下文章

什么是Servlet?

什么是servlet?servlet的作用?——计算机网络系列学习笔记

什么是servlet?servlet的作用?——计算机网络系列学习笔记

什么是servlet?

Servlet是什么?JSP和Servlet的区别。Servlet的生命周期。

Servlet