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高级编程(一)的更多相关文章
-
Java Web高级编程(四)
WebSocket 一.WebSocket的产生 用户希望Web页面可以进行交互,用于解决这个问题的技术是JavaScript,现在Web上有许多的可用的JavaScript框架,在使用极少的Java ...
-
Java Web高级编程(三)
使用过滤器改进应用程序 一.过滤器的目的 过滤器是可以拦截访问资源的请求.资源的响应或者同时拦截两者的应用组件.过滤器可以检测和修改请求和响应,同时也可以拒绝.重定向或转发请求.javax.servl ...
-
Java Web高级编程(二)
使用会话维持状态 一.会话 为了实现关联同一个用户端的多个请求和这些请求之间数据的共享,需要用到会话,会话用于维持请求和请求之间的状态.从服务器的角度,当用户的Web浏览器打开第一个链接到服务器的套接 ...
-
java web高级编程 笔记1
chapter1:了解web应用程序 web应用程序主要组件: Servlet 过滤器 监听器 JSP chapter2:各类web容器介绍 略 chapter3:Servlet介绍 Servlet是 ...
-
Java web切面编程
在我们的 web开发中 我们在 对公用的 一些方法 我们需要抽取出来 这样达到 代码的冗余 今天 我利用项目上用的AOP的 实际 应用做了一个整理 首先 xml配置 扫描 <?xm ...
-
JavaEE-实验三 Java数据库高级编程
该博客仅专为我的小伙伴提供参考而附加,没空加上代码具体解析,望各位谅解 1.在MySQL中运行以下脚本 CREATE DATABASE mydatabase; USE mydatabase; CREA ...
-
吴裕雄--天生自然JAVA面向对象高级编程学习笔记:继承的应用
class Array{ // 表示数组 private int temp[] ; // 整型数组 private int foot ; // 定义添加位置 public Array(int len) ...
-
吴裕雄--天生自然JAVA面向对象高级编程学习笔记:匿名内部类
interface A{ public void printInfo() ; // } class B implements A{ // 实现接口 public void printInfo(){ S ...
-
吴裕雄--天生自然JAVA面向对象高级编程学习笔记:包装类
public class WrapperDemo01{ public static void main(String args[]){ int x = 30 ; // 基本数据类型 Integer i ...
随机推荐
-
Mybatis 字符绑定
http://blog.csdn.net/softwarehe/article/details/8889206
-
mysql参数sql_log_bin
如果想在主库上执行一些操作,但不复制到slave库上,可以通过修改参数sql_log_bin来实现. 比如想在主库上修改某个表的定义,但是在slave库上不做修改: master mysql> ...
-
高仿QQ的即时通讯应用带服务端软件安装
Android 基于xmpp协议,smack包,openfire服务端(在下面)的高仿QQ的即时通讯实现.实现了注册,登录,读取好友列表,搜索好友,添加分组,添加好友,删除好友,修改心情,两个客户端之 ...
-
再也不要说,jquery动画呆板了
1 show()方法和hide()方法 $("selector").show() 从display:none还原元素默认或已设置的display属性$("selecto ...
-
网站出现service unavailable的解决方法
特别提示:本文的教程仅适合采用windows服务器的IIS组件上操作,service unavailable是许多网站会经常遇到的问题,希望对大家有用. 昨天一小段时间网站出现了service una ...
-
laravel使用Schema创建数据表
1.简介 迁移就像数据库的版本控制,允许团队简单轻松的编辑并共享应用的数据库表结构,迁移通常和Laravel的schema构建器结对从而可以很容易地构建应用的数据库表结构.如果你曾经告知小组成员需要手 ...
-
mybatis-generator使用心得
通过web service给前端返回数据 首先后台先建表, 再针对表进行CRUD的各种sql, 然鹅,现在流行做法是使用mybatis,直接xml把sql融合了,什么事都有利弊,像我这样的手写sql党 ...
-
[NOI2016]旷野大计算
Subtask0 造计算机神题.给一个忠告:珍爱生命,远离旷野大计算...... 代码在这里:戳我 Subtask1 给定\(a,b\):求\(-2a-2b\). 熟悉操作环境:\([-(a+b)]& ...
-
New Concept English Two 20 52
$课文50 乘车兜风 510. I love travelling in the country, but I don't like losing my way. 我喜欢在乡间旅行,但却不愿意迷路. ...
-
WebView 加载网页和java 与js交互
[mw_shl_code=java,true]WebView是一个可以显示网页的控件.需求:通过WebView加载assets下的html文件.实现页面的缩放.向menu键添加:前进.后退和刷新,实现 ...