引入servlet概念
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了引入servlet概念相关的知识,希望对你有一定的参考价值。
Servlet简介
Java Servlet是和平台无关的服务器端组件,它运行在Servlet容器中。Servlet容器负责Servlet和客户的通信以及调用Servlet的方法,Servlet和客户的通信采用“请求/响应”的模式。
Servlet可以完成的功能:
- 创建并返回基于客户请求的动态html页面。
- 创建可嵌入到现有HTML页面中的部分HTML页面(HTML片段)。
- 与其他服务器资源(数据库或基于JAVA的应用程序)进行通信。
Servlet容器响应客户请求的过程:
——请求——>> ———ServletRequest——>>
客户 Servlet容器 Servlet
<<——响应—— <<——ServletResponse——
Servlet的HelloWorld
1、创建一个Servlet接口的实现类。
public class HelloServlet implements Servlet{重写里面的方法}
2、在web.xml文件中配置和映射这个Servlet
注:同一个Servlet可以被映射到多个URL上,即多个<servlet-mapping>元素的<servlet-name>子元素的设置可以使同一个Servlet注册名
在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:一种格式是“ *.扩展名 ”,另一种可是是以正斜杠(/)开头并以(*)结尾--(/*)
3、Servlet容器:运行Servlet、JSP、Filter等的软件环境。
可以创建Servlet,并调用Servlet的相关生命周期方法
JSP,Filter,Listener,Tag.....
4、Servlet 生命周期的方法:
构造器:第一次请求Servlet时,创建Servlet的实例,调用构造器。(这说明Serlvet是单实例的)
init方法:只被调用一次,在创建好实例后立即被调用,用于初始化当前Servlet
service:被多次调用,每次请求都会调用service方法,实际用于响应请求。
destroy:只被调用一次,在当前Servlet所在的WEB应用被卸载前调用,用于释放当前Servlet所占用的资源。
5、load-on-startup参数:
配置在servlet节点中:
<servlet>
<servlet-name>Secondservlet</servlet-name>
<servlet-class>com.ttzzyy.tzy.SecondServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
load-on-startup:可以指定Servlet被创建的时机。若为负数,则在第一次请求时被创建,若为0或正数,则在当前WEB应用被Servlet容器加载时创建实例,且数值越小越早被创建。
6、ServletConfig(初始化参数只有配置的那个Servlet才能获取)
- 公有接口 ServletConfig
一个用于在初始化时为servlet传送信息servlet容器的servlet配置对象
配置信息包括:初始化参数(一系列的名字/数值对),和一个 ServletContext
对象(它给出了servlet关于服务器的信息)
java.lang.String |
getInitParameter(java.lang.String name) 返回一个包含给定名字的初始化参数,若此参数不存在就返回一个空值。 |
java.util.Enumeration |
getInitParameterNames()
返回context的初始化参数的名字 ,用一个字符串对象枚举变量的形式。如果相应的context没有初始化参数,则就返回一个空的枚举变量。 |
ServletContext |
getServletContext()
返回一个servlet正在内中执行的 ServletContext 的参考。 |
java.lang.String |
getServletName()
返回该servlet实例的名称。 |
<servlet>
<servlet-name>helloservlet</servlet-name>
<servlet-class>com.ttzzyy.tzy.HelloServlet</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>
7、ServletContext(初始化参数可以为所有的Servlet所获取)
Servlet引擎为每个WEB应用程序都创建一个对应的ServletContext对象,ServletContext对象被包含在ServletConfig对象中,调用
ServletConfig.getServletContext方法可以返回ServletContext对象的引用.
由于一个WEB应用程序中所有的Servlet对象被称之为application对象(Web应用程序对象)。
可以由ServletConfig获取
该对象代表当前WEB应用:可以认为Servlet是当前WEB应用的一个大管家,可以从中获取到当前WEB应用的各方面的信息。
java.lang.String |
getInitParameter(java.lang.String name) 返回一个包含给定名字的context-wide 初始化参数,若此参数不存在就返回一个空值。 |
java.util.Enumeration |
getInitParameterNames()
返回context的初始化参数的名字 ,用一个字符串对象枚举变量的形式。如果相应的context没有初始化参数,则就返回一个空的枚举变量。 |
<context-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</context-param>
<context-param>
<param-name>jdbcUrl</param-name>
<param-value>jdbc:mysql:///tzy</param-value>
</context-param>
8、GET请求和POST请求
使用GET方式传递参数:
在浏览器地址栏中输入某个URL地址或单机网页上的一个超链接时,浏览器发出HTTP请求消息的请求方式为GET。
如果网页中的<form>表单元素的method属性被设置为“GET”,浏览器提交这个FORM表单时生成的HTTP请求消息的请求方式也为GET。
使用GET请求方式给WEB服务器传递参数的格式:http://www.XXX.com/counter.jsp?name=abs&password=123
使用GET方式传送的数据量一般限制在1KB以下。
使用POST方式传递参数:
POST请求方式主要用于向WEB服务器端程序提交FORM表单中的数据:form表单method置为POST
POST方式将各个表单字段元素及其数据作为HTTP消息实体内容发送给WEB服务器,传送的数据量要比使用GET方式传送的数据量大得多。
9、如何在Servlet中获取请求信息:
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {}
ServletRequest:封装了请求信息,可以从中获取到任何请求信息。
ServletResponse :封装了响应信息,如果想给用户什么响应,具体可以使用该接口的方法实现。
这两个接口的实现类都是服务器给予实现的,并在服务器调用service方法时传入。
java.lang.String | getParameter(java.lang.String name) 返回一个请求参数的字符串值。若该参数不存在,则返回一个空值。 |
java.util.Enumeration | getParameterNames() 返回一个包含了请求中的参数名字的字符串对象的枚举变量。 |
java.lang.String[] | getParameterValues(java.lang.String name) 返回一个包含所有的给定请求参数的值的字符串对象的向量。若该参数不存在,则返回一个空值。 |
Map | getParameterMap() 返回请求参数的键值对:key:参数名;value:参数值,String数组类型 |
http://localhost:8080/tzytzy/loginServlet?user=asd&password=123&interesting=reading&interesting=game&interesting=party
注:获取请求的方式:HttpServletRequest是ServletRequest的子接口,针对于HTTP请求所定义。里边包含了大量获取HTTP 请求的方法.
获取请求的URI
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String requestURI = httpServletRequest.getRequestURI();
System.out.println(requestURI);
获取请求的方式:
String method = httpServletRequest.getMethod();
System.out.println(method);//GET
获取请求参数对应的那个字符串,即?后的那个字符串(POST方法获取为null)
String queryString = httpServletRequest.getQueryString();
System.out.println(queryString);//user=asd&password=123&interesting=reading&interesting=game&interesting=party
获取请求的Servlet的映射路径
System.out.println(httpServletRequest.getServletPath()); // /loginServlet
应答:ServletResponse
getWrite:返回PrintWriter对象,调用该对象的print()方法,将把print()中的参数直接打印到客户的浏览器上。
PrintWriter writer = response.getWriter();
writer.println("Helloworld");
设置响应的内容类型:response.setContentType("application/msword");这个是下载文件word
请求的重定向:****sendRedirect(java.lang.String location)
用指定的重定位URL向客户端发送一个临时重定位响应消息。****(此方法为HttpServletResponse中定义)
10、GenerivServlet:
是一个Servlet。是Servlet接口和ServletConfig接口的实现类。但它是一个抽象类,其中Servlice方法为抽象方法
如果新建的Servlet程序直接继承了GenericServlet会使开发更简洁
具体实现:
在GenericServlet中声明一个ServletConfig类型的成员变量,在init(ServletConfig)方法中对其进行初始化
利用ServletConfig成员变量的方法实现了ServletConfig接口的方法
还定义了一个init()方法,在init(ServletConfig)方法中对其进行调用,子类可以直接覆盖inti()在其中实现对Servlet的初始化
不建议直接覆盖init(ServletConfig),因为如果忘记编写super(ServletConfig),而还是用了ServletConfig接口的方法,则会抛出空指针异常
11、强大的HttpServlet
是一个Servlet,继承自GenericServlet,针对于HTTP协议所定制。
在Service()方法中直接把ServletRequest和ServletResponse转为HttpServletRequest和HttpServletResponse并调用了重载service(HttpServletRequest,HttpServletResponse).
实际开发中,直接继承HttpServlet,并根据请求方式复写doxxx()方法接口,
好处:直接由针对性的覆盖doxxx()方法。直接使用HttpServletRequest和HttpServletResponse,不再需要强转。
以上是关于引入servlet概念的主要内容,如果未能解决你的问题,请参考以下文章