2017.11.2 JavaWeb----第六章 Servlet技术

时间:2022-06-28 09:01:38

JavaWeb ------第六章 Servlet技术

(1)在Web应用程序开发中,一般由JSP JavaBean技术和 Servlet技术的结合实现MVC开发模式。在MVC开发模式中将Web程序的组建分为3部分:视图、控制、业务,分别由JSP、Servlet、JavaBean实现。

(2)Servlet是用Java语言编写的服务器端程序,是由服务器调用和执行。Servlet技术可以处理客户端传来的HTTP请求,并返回一个响应。

(3)Servlet编程接口

@Servlet的框架是由javax.servlet(里面定义了所有的Servlet类都必须实现或拓展通用的类)和javax.servlet.http(采用HTTP协议通道的HttpServlet类)两个java包组成。

下面是Servlet的编程接口

功能 类和接口
Servlet实现 javax.servlet.Servlet, javax.servlet.SingleThreadModeljavax.servlet.GenericServlet, javax.servlwt.httpHttpServlet
Servlet配置 javax.servlet.ServletConfig
Servlet异常 javax.servletServletExceotion, javax.servletUnavailableException
请求和响应 javax.servletServletRequest, javax.servlet.ServletResponsejavax.servlet.ServletInputStream ,javax.servlet.ServletOutputStream
会话跟踪 javax.servlet.http.HttpSession, javax.servlet.http.HttpSessionBindingListeener
Servlet上下文 javax.servlet.ServletContext
Servlet协作 javax.servlet.RequestDispactcher
其他 javax.servlet.http.Cookie,javax.servlet.http.HttpUtils

(4)设计Servlet

@*#1有下列三种方法实现:

1.实现Servlet接口
创建Servlet类,必须直接或者间接实现javax.servlet.Servlet接口; 2.继承GenericServlet
GenericServlet是Servlet接口的直接实现类; 3.继承HttpServlet
HttpServlet类是javax.servlet.GenericServlet类的一个子类(都采用这种)

*#2.Servlet基本结构

Servlet程序的基本结构:
package....;
import.....;
piblic class Servlet 类名称 extends HttpServlet{
public void int(){}
public void doGet(HttpServletRequest request,HttpServletResponse response){}
public void doPost(HttpServletRequest request,HttpServletResponse response){}
public void service(HttpServletRequest request,HttpServletResponse response){}
public void destroy(){}
} 说明:
Servlet类需要继承类HttpServlet
Servlet的父类HttpServlet中包含以下几个重要方法,常根据需要重写他们
init():初始化方法,Servlet对象创建后,接着执行该方法,
doGet():当请求类型是“get”时,调用该方法。
doPost():当请求类型是“post”,调用该方法。
service():Servlet处理请求时自动执行service()方法,该方法根据请求的类型(get或post)调用doGet()或doPost()方法。
destroy():Servlet对象注销时自动执行。

*#3.Servlet的建立

建立Web工程找到WebRoot/WEB-INF目录下创建的web.xml。该文件配置了启动Web工程时需要服务器设置的一些初始信息。web.xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>JavaTest</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>helloworld</servlet-name>
<servlet-class>servlets.helloworld</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>//这里配置的是Web工程默认的额主页名称:index.jsp
</welcome-file-list>
</web-app> 说明:对于webxml中配置的默认主页名称:index.jsp其作用是当客户端请求进入该项目工程时可以采用以下方式:http://地址:8080/工程名 注意记住映射地址在引用时使用该地址.

*#4.新建的Servlet的基本结构代码

package servlets;

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; public class helloworld extends HttpServlet { /**
*
*/
private static final long serialVersionUID = 1L;
/**
* Constructor of the object.
*/
public helloworld() {
super();
} /**
* Destruction of the servlet. <br>
*/
public void destroy() {
super.destroy(); // Just puts "destroy" string in log
// Put your code here
}
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the GET method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException { response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY>");
out.print(" This is ");
out.print(this.getClass());
out.println(", using the POST method");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
public void init() throws ServletException {
// Put your code here
}
}

*#4.1自动修改的webxml,在其中添加了Servlet的配置信息,其内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>JavaTest</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>helloworld</servlet-name>
<servlet-class>servlets.helloworld</servlet-class>
</servlet> <servlet-mapping>
<servlet-name>helloworld</servlet-name>
<url-pattern>/helloworld</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>

#5.编写Servlet代码---重写doGet()方法或doPost()方法

修改代码实际上是局势重写doGet()和doPost方法。这两个方法差异是在响应请求时,根据响应方法(get/post选择)所以重写其中一个另一个直接调用以实现的方法即可。

@
#6.修改配置文件

虽然自动配置了Servlwt,但仍可按需要修改(或自己建立)webxml。配置的内容包括:Servlet的访问问地址、加载的方式初始化参数其中必须配置的Servlet的访问地址。

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>servlets.HelloWorld</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/HelloWorld</url-pattern> //访问地址:调用servlet时使用的路径匹配名。必须记清该名称,否则会找不到
<servlet-mapping>

*#7.部署并运行Servlet

部署到对应的文件路径下才可以运行,

启动tomcat服务器之后在浏览器地址栏输入:http://localhost:8080/javaText/HelloWorld

在浏览器中直接访问Servlet属于get方式,因此会执行doGet方法。

@**(5)Servlet常用对象及其方法

JSP有九个内置对象,其中7个内置对象都是由Servlet类或接口直接或间接创建的对象。

JSP内置对象 Servlet类或接口
out javax.servlet.http.HttpServletResponse 得到PrinterWriter类并创建Servlet的out对象
request javax.servlet.http.HttpServletRequest
response javax.servlet.http.HttpServletResponse
session javax.servlet.http.HttpSession
application javax.servlet.ServletContext
config javax.servlet.ServletConfig
exception javax.servlet.ServletException
以下有几种常用方法:
request对象常用方法
1.javax.servlet.http.HttpServletRequest
void setCharacterEncoding():设置请求信息字符编码,常用与解决post方式下参数值汉字乱码问题
String getparameter(Strring paraName):获取单个参数值
String getParameterValues(String paraName):获取同名的参数的多个值
Object getAttribute(String attributeName):获取request范围内属性的值
void setAttribute(String attributeName,Object object):设置request范围内的属性的值
void removeAttribute(String attributeName):删除request范围内的属性
response对象常用方法:
2.javax.servlet.http.HttpServletRequest
PrinterWriter response.getWinter():获得out对象
void response.setContentType(String contentType):设置响应信息类型
void sengRedirect(String url):重定向