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的工作流程
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的作用?——计算机网络系列学习笔记