Servlet

一、创建Servlet类

在Java EE中,Servlet用来接收和响应终端用户的请求。Servlet是所有Web应用程序的核心类,是唯一既可以直接处理和响应用户请求,也可以将处理工作委托给应用中的其它部分的类。除非某些过滤器提前终止了客户端的请求,否则所有的请求都将被发送到某些Servlet中。

所有的Servlet都实现了javax.servlet.Servlet接口,但通常不是直接实现的,Servlet知识一个简单的接口,包含了初始化并销毁和处理请求的方法。无论什么类型的请求都将会调用service方法。

作为响应HTTP请求的java.servlet.http.HttpServlet,并实现了只接受HTTP请求的service方法。提供了响应每种HTTP方法类型的方法的空实现。

方法 Servlet方法 目的
GET doGet() 从指定的URL中获取资源
HEAD doHead() 与GET一致,但是只返回头部数据
POST doPost() 通常用于处理Web表单提交
PUT doPut() 存储URL中提供的实体
DELETE doDelete() 删除URL标识的资源
OPTIOND doOptions() 返回支持的HTTP方法
TRACE doTrace() 用于诊断目的

Servlet将总是继承HttpServlet。这样方法的接受的是javax.servlet.http.HttpServletRequest和javax.servlet.http.HttpServletResponse参数,这样就可以轻松访问Servlet服务所处理的请求中的HTTP特定的特性。

创建全新的空Servlet开始,让它继承HttpServlet。任何未重写的HTTP Servlet方法都将返回一个HTTP状态405作为响应,需要重写doGET()方法,添加对HTTP GET方法的支持。

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class helloServlet extends HttpServlet{   
@Override   
protected void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException{   resopnse.getWriter().println(" ");   }
}

初始化方法和销毁方法

@Override
public void init() throws ServletException
{
System.out.println("Servlet " + this.getServletName() + " has started.");
} @Override
public void destroy()
{
System.out.println("Servlet " + this.getServletName() + " has stopped.");
}

二、配置可部署的Servlet

在创建完Servlet之后,尽管已经有了一个可以响应HTTP GET请求并发出问候的类,需要再WEB-INF目录中创建的web.xml文件,并对Servlet进行配置,使它可以正确地部署到服务器中。然后使得浏览器可以访问到该Servlet。

在web.xml中的初始化文件:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"> <display-name>Hello World Application</display-name><--?代表了应用程序在应用服务器中显示的名字--> </web-app>

当需要该诉Web容器创建一个之前实例Servlet的实例,因此在描述符文件中的开始和结束标志符中添加一个Servlet标签:

<servlet>
<servlet-name>helloServlet</servlet-name>
<servlet-class>com.wrox.HelloServlet</servlet-class>
</servlet>

同时

<load-on-startup>1</load-on-startup>

如果多个Servlet配置都包含了该标签,它们将按照标签内值的大小顺序启动,值越小越先启动。,如果多个Servlet的<load-on-startup>配置相同,将按照它们在描述符文件中出现的顺序启动。

将Servlet映射到URL中,在告诉应用服务器如何启动Servlet之后,需要告诉该Servlet应该如何应该对那些请求URL做出响应:

<servlet-mapping>
<servlet-name>helloServlet</servlet-name>
<url-pattern>/greeting</url-pattern>
</servlet-mapping>

使用该配置之后,所有访问应用程序相对URL/greeting的请求都将有helloServlet处理,其中<servlet>和<servlet-mapping>标签内的<servlet-name>标签应该一致。当然可以通过多个<url-pattern>标签,让多个URL映射到同一个servlet中。对有相同逻辑但是不同处理页面的web就可以将其连接到同一个servlet,只是在<servlet-name>中添加不同的实例名称。

三、doGet()和doPost()

Servlet类的service方法会处理所有到达的请求。最终,它必须根据所使用的协议解析并处理到达请求中的数据,然后返回客户端可接受的响应。扩展HttpServlet使我们不需要考虑到任何细节。

HttpServletRequest接口是对ServletRequest的扩展,将提供关于收到请求的额外的与HTTP协议相关信息。

获取请求参数:

HttpServletRequest最重要的功能是从客户端发送的请求中获取参数。请求参数有两种不同的形式:

查询参数(URI参数),以application/x-www-form-urlencodeed或multipart/form-data编码的请求正文。

getParameter方法将返回参数的单个值,如果参数有多个值,将返回第一个值,getParameterValues将返回参数的值的数组。

确定与请求内容相关的信息:

getContentType方法将确定HTTP请求内容的类型,

getContentLenght方法和getContentLengthLong都返回了请求正文的长度,

getCharacterEncoding方法将返回请求内容的字符编码。

读取请求的内容:

getInputStream和getReader都可以用来读取请求的内容,如果是UTF-8和ISO-8859-1则使用getReader是最简单的方法,如果是二进制格式则使用getInputStream是最方便的,但是在调用其中一个方法之后不可以再调用另外一个。

获取请求的特有数据:

getRequestURL,返回客户端完整用于创建请求的完整的URL。

getRequestURI,只返回URL中服务器路径部分。

getServletPath,返回更少的URI。

getHeader,返回制定名字的头数据。

getHeaderName,返回请求中所有头数据的名字的枚举。

getIntHeader和getDataHeader。

使用HttpServletResponse

HttpServletResponse提供了对请求中与HTTP协议相关属性的访问,并且可以使用相应对象完成设置响应头,编写响应正文,重定向请求,设置HTTP状态码以及将Cookies返回到客户端等任务。

编写响应正文:

就是讲内容输出道响应正文中,可以是在浏览器中显示的HTML、浏览器中希望获取的图像或者下载的文件内容。getOutputStream方法将返回一个javax.servlet.ServletOutputStream,而方法getWriter将返回一个java.io.PrintWriter,通过他们可以向响应中输出数据,但是不要对一个对象同时使用上述两种方法。在向响应正文中输出数据时,可能需要设置内容类型或编码格式:setContentType和setCharacterEncoding。

另外还可以使用:

setStatus:设置HTTP响应状态码,

getStatus:获取当前的响应状态,

sendError:设置状态码,

sendRedirect:将客户端重定向至另一个URL。

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
String user = request.getParameter("user");
if(user == null)
user = HelloServlet.DEFAULT_USER; response.setContentType("text/html");
response.setCharacterEncoding("UTF-8"); PrintWriter writer = response.getWriter();
writer.append("<!DOCTYPE html>\r\n")
.append("<html>\r\n")
.append(" <head>\r\n")
.append(" <title>Hello User Application</title>\r\n")
.append(" </head>\r\n")
.append(" <body>\r\n")
.append(" Hello, ").append(user).append("!<br/><br/>\r\n")
.append(" <form action=\"greeting\" method=\"POST\">\r\n")
.append(" Enter your name:<br/>\r\n")
.append(" <input type=\"text\" name=\"user\"/><br/>\r\n")
.append(" <input type=\"submit\" value=\"Submit\"/>\r\n")
.append(" </form>\r\n")
.append(" </body>\r\n")
.append("</html>\r\n");
}

四、初始化参数配置应用程序

初始化参数配置应用程序可以提供一些配置应用程序和其中Servlet的方式。通过上下文初始化参数和Servlet初始化参数进行设置是最简单的方法,这些参数可以定义关系数据库的链接信息,提供发送订单警告的邮件地址,这些参数在启动时定义,重启才会被修改。

    <context-param>
<param-name>settingOne</param-name>
<param-value>foo</param-value>
</context-param>
<context-param>
<param-name>settingTwo</param-name>
<param-value>bar</param-value>
</context-param>

在初始化参数之后可以在Servlet代码的任何地方使用这些参数

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException
{
ServletConfig c = this.getServletConfig();
PrintWriter writer = response.getWriter(); writer.append("database: ").append(c.getInitParameter("database"))
.append(", server: ").append(c.getInitParameter("server"));
}

另外一种初始化参数的方法是通过注解:

@WebServlet{
name = "servletParameterServlet",
urlPatterns = {"/servletParameters"},
initParams = {
@WebInitParam{name = "database", value = "CustomerSupport"},
@WebInitParam{name = "server", value = "10.0.12.5"}
}
}

Java Web高级编程(一)的更多相关文章

  1. Java Web高级编程(四)

    WebSocket 一.WebSocket的产生 用户希望Web页面可以进行交互,用于解决这个问题的技术是JavaScript,现在Web上有许多的可用的JavaScript框架,在使用极少的Java ...

  2. Java Web高级编程(三)

    使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...

  3. Java Web高级编程(二)

    使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...

  4. java web高级编程 笔记1

    chapter1:了解web应用程序 web应用程序主要组件: Servlet 过滤器 监听器 JSP chapter2:各类web容器介绍 略 chapter3:Servlet介绍 Servlet是 ...

  5. Java web切面编程

    在我们的 web开发中  我们在 对公用的 一些方法 我们需要抽取出来   这样达到 代码的冗余   今天 我利用项目上用的AOP的 实际 应用做了一个整理 首先  xml配置  扫描 <?xm ...

  6. JavaEE-实验三 Java数据库高级编程

    该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.在MySQL中运行以下脚本 CREATE DATABASE mydatabase; USE mydatabase; CREA ...

  7. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用

    class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...

  8. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类

    interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...

  9. 吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类

    public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...

随机推荐

  1. PHP提高网站性能的一些方法

    前段时间面试问到了这个问题,回答的不是很全面,就去问了度娘,得到了一些比较全的答案,由于出处较多就没法确定原文出处了.下面是分享的答案. 一.大型网站性能提高策略: 大型网站,比如门户网站,在面对大量 ...

  2. POST和GET有什么区别?

    1. GET主要用于从服务器查询数据,POST用于向服务器提交数据 2. GET通过URL传递数据,POST通过http请求体传递数据 3. GET传输数据量有限制,不能大于2kb,POST传递的数据 ...

  3. jvm内存回收诡异现象

    在知乎上看到一篇提问,于是做了个实验帮助他解答,这里整理成一篇文章分享一下. 先看代码如下代码: /** * Created on 2017/12/16. * * -verbose:gc -XX:+U ...

  4. 分享Sql Server 2008 r2 数据备份,同步服务器数据(一.本地备份)

    最近在部署一个系统,处于数据安全的考虑,因此对相应的数据库服务器定时备份,以及数据同步到备份服务上.之前在另外的一个项目中也做过相应的操作,但是操作都是按照查找到的文章一步一步的操作,碰到一些细节问题 ...

  5. CentOS7脱机安装SQL Server 2017

    SQL Server on Linux也发布一段时间了,官方上支持Red Hat, SUSE, Ubuntu.手上没有以上Linux版本,选用了与Red Hat最接近的CentOS7.4来进行安装和测 ...

  6. 《跟我学IDEA》二、配置maven、git、tomcat

    上一篇博文我们讲解了如何去下载并安装一个idea,在这里我们推荐的是zip的解压版,另外我们配置的一些编码和默认的jdk等.今天我们来学习配置maven.git.tomcat等.还是那句话,工欲善其事 ...

  7. 【liferay】1、使用alloy-UI发送ajax请求

    1.首先liferay要发送ajax请求,那么就需要在jsp中定义resourceURL <portlet:resourceURL var="workDeal" id=&qu ...

  8. 大数据学习(8)Hive基础

    什么是Hive Hive是一个基于HDFS的查询引擎.我们日常中的需求如果都自己去写MapReduce来实现的话会很费劲的,Hive把日常用到的MapReduce功能,比如排序.分组等功能进行了抽象, ...

  9. Javascript中的Microtask和Macrotask——从一道很少有人能答对的题目说起

    首先我们来看一道题目,如下javascript代码,执行后会在控制台打印出什么内容? async function async1() { console.log('async1 start'); aw ...

  10. 浅谈Unix I/O模型

    关于I/O模型的文章比较多,参考多篇后理解上仍然不太满意,终需自己整理一次,也是编写高吞吐量高性能网络接口模块的基础.这里所说的主要针对网络I/O,近几年面对越来越大的用户请求量,如何优化这些步骤直接 ...