Javaweb学习(三):Servlet程序

时间:2023-03-09 21:23:53
Javaweb学习(三):Servlet程序

 好了,既然开发环境已经配置好了。那么我们首先要搞定得便是servlet了,至于为什么不先去研究jsp,这是因为jsp与servlet本就是一体两面,jsp其本身经过编译、载入、转化等步骤最终会成为servlet(之后会专门来介绍这两个得关系)。所以我们首先学习servlet,如果servlet学习好了得话,那么在jsp中遇见得许多错误也会迎刃而解。那么,一起来研究下servlet把。

 一、CGI

  CGI即公共网关接口,它提供一个计算机程序同HTTP协议或者WWW服务的接口,也就是人机交互接口,其功能主要是处理来自表单得信息,然后在服务器再进行处理,最后反馈给浏览器。(只做简单了解)

 二、Servlet

  servlet又叫做服务端小程序,是在服务器上运行得小程序,它的主要功能是能够动态获得和修改数据,从而生成动态得web内容。其运行速度要比上述得CGI程序要快,主要原因是因为各个用户对servlet得请求会被创建为程序中得一个线程,从而降低了系统得开销。

 1.servlet程序 

  先来写第一个servlet程序把,根据程序我们来探索其内部原理:

  ①首先选择File—new—web project—输入我们网站项目得名称—finish即可创建一个web项目。

  Javaweb学习(三):Servlet程序

  ②创建包:右键src—new—Package—输入包名(如cc.study)

Javaweb学习(三):Servlet程序

  ③创建Servlet:右键包—new—Servlet—输入servlet程序名称

  Javaweb学习(三):Servlet程序

  ④创建成功显示

  Javaweb学习(三):Servlet程序

  ⑤创建html 表单并对servlet进行访问获取结果

  修改web.xml中MainServlet得访问路径

 <?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" metadata-complete="true">
<display-name></display-name>
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>MainServlet</servlet-name>
<servlet-class>cc.study.MainServlet</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>MainServlet</servlet-name>
<url-pattern>/main.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

  index.html代码:

 <!DOCTYPE html>
<html>
<head>
<title>index.html</title> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="this is my page">
<meta http-equiv="content-type" content="text/html; charset=UTF-8"> <!--<link rel="stylesheet" type="text/css" href="./styles.css">--> </head> <body>
<form action="main.do" method="get">
姓名:<input type="text" name="name">
<button>确认</button>
</form>
</body>
</html>

  Servlet对doGet进行重写

 package cc.study;

 import java.io.IOException;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
*
* 项目名称:Boke
* 类名称:MainServlet
* 类描述: 对form表单提交姓名进行动态响应
* 创建人:墨染、
* 创建时间:2017-11-27 下午3:57:26
* 修改人:墨染、
* 修改时间:2017-11-27 下午3:57:26
* 修改备注:
* @version
*
*/
public class MainServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
if (name != "") {
if (name.equals("zhangsan")) {
out.write("");
} else {
out.write("false");
}
} else {
out.write("name is null");
}
out.flush();
out.close();
}
}

  获得结果如下显示:

  输入zhangsan结果:Javaweb学习(三):Servlet程序

  输入a结果:    Javaweb学习(三):Servlet程序

  不进行输入结果:Javaweb学习(三):Servlet程序

 2.servlet实现过程  

  ①浏览器向服务器发送请求

  ②服务器接收到请求并将改请求发送到服务端程序并判断由哪一个servlet进行处理

  ③servlet根据请求内容进行处理,(可能会操作数据库,也可能只返回某些数据)

  ④将数据返回给服务器,服务器再反馈给浏览器进行动态显示。

 3.Servlet生命周期

  一个Servlet程序得整个生命周期是由创建——销毁得。其主要得体现方法为:创建init(),处理请求Service(),销毁destroy()。

  ①init方法和destroy方法在整个生命周期中只运行一次

  当只用init方法时:

 public class MainServlet extends HttpServlet {
private String flag="";
@Override
public void init(ServletConfig config) throws ServletException {
flag="init start";
}
// @Override
// public void destroy() {
// flag="destory stop";
// }
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
out.println(flag);
out.flush();
out.close();
}
}

  获得结果为init start,即说明init方法在servlet进程创建得时候运行了,给flag赋值为init start。

  当用init和destroy时,可以看到init方法是在开始不用调用执行,而destroy方法则是需要在doget方法内对其进行调用来处理,一般是用来结束数据库连接,或者保存文件使用。

 public class MainServlet extends HttpServlet {
private String flag="";
@Override
public void init(ServletConfig config) throws ServletException {
flag="init start";
}
@Override
public void destroy() {
System.out.println("destory被调用了");
} @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
resp.setCharacterEncoding("utf-8");
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
out.println(flag);
out.flush();
out.close();
destroy();
}
}

  ②service方法是整个servlet中最主要得执行方法,下面是父类中httpServlet得service代码,根据重写方法来启动线程对程序进行处理。

   protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
String method = req.getMethod(); if (method.equals("GET")) {
long lastModified = getLastModified(req);
if (lastModified == -1L)
{
doGet(req, resp);
} else {
long ifModifiedSince;
try {
ifModifiedSince = req.getDateHeader("If-Modified-Since");
}
catch (IllegalArgumentException iae) {
ifModifiedSince = -1L;
}
if (ifModifiedSince < lastModified / 1000L * 1000L)
{
maybeSetLastModified(resp, lastModified);
doGet(req, resp);
} else {
resp.setStatus();
}
}
}
else if (method.equals("HEAD")) {
long lastModified = getLastModified(req);
maybeSetLastModified(resp, lastModified);
doHead(req, resp);
}
else if (method.equals("POST")) {
doPost(req, resp);
}
else if (method.equals("PUT")) {
doPut(req, resp);
}
else if (method.equals("DELETE")) {
doDelete(req, resp);
}
else if (method.equals("OPTIONS")) {
doOptions(req, resp);
}
else if (method.equals("TRACE")) {
doTrace(req, resp);
}
else
{
String errMsg = lStrings.getString("http.method_not_implemented");
Object[] errArgs = new Object[];
errArgs[] = method;
errMsg = MessageFormat.format(errMsg, errArgs); resp.sendError(, errMsg);
}
}

  

  本文旨在帮助大家理解什么servlet以及servlet在生产流程中担任得角色,希望大家能够通过此文对此有一个直观得认识,当然,文中可能有些地方也可能会有措辞不当或者理解不充分得地方,如果大家有所发现,希望在评论处给于指正。:-D