第2章 2.10 Servlet介绍

来源:互联网 发布:网络的攻击与防范 编辑:程序博客网 时间:2024/05/01 23:08

2.10.1 Servlet的开发

Servlet是一个特殊的Java类,这个Java类必须继承HttpServlet。
Servlet提供不同的方法用于响应客户端请求(doGet、doPost、doPut、doDelete)
客户端的请求通常只有GET和POST两种,Servlet为了响应这两种请求,必须重写doGet()和doPost()两个方法。或者重写service()方法即可响应客户端的所有请求。
HttpServlet还包含两个方法。
*init(ServletConfig config):初始化Servlet资源
*destroy():销毁Servlet实例时,自动调用该方法的回收资源

Servlet示例:
<span style="font-size:18px;"><span style="font-size:18px;">import javax.servlet.*;import javax.servlet.http.*;import javax.servlet.annotation.*;import java.io.*;//Servlet必须继承HttpServlet类@WebServlet(name="firstServlet" , urlPatterns={"/firstServlet"})public class FirstServlet extends HttpServlet{//客户端的响应方法,使用该方法可以响应客户端所有类型的请求public void service(HttpServletRequest request,HttpServletResponse response) throws ServletException,java.io.IOException{//设置解码方式request.setCharacterEncoding("GBK");response.setContentType("text/html;charSet=GBK");//获取name的请求参数值String name = request.getParameter("name");//获取gender的请求参数值String gender = request.getParameter("gender");//获取color的请求参数值String[] color = request.getParameterValues("color");//获取country的请求参数值String national = request.getParameter("country"); //获取页面输出流PrintStream out = new PrintStream(response.getOutputStream());//输出HTML页面标签out.println("<html>");out.println("<head>");out.println("<title>Servlet测试</title>");out.println("</head>");out.println("<body>");//输出请求参数的值:nameout.println("您的名字:" + name + "<hr/>");//输出请求参数的值:genderout.println("您的性别:" + gender + "<hr/>");//输出请求参数的值:colorout.println("您喜欢的颜色:");for(String c : color){out.println(c + " ");}out.println("<hr/>");out.println("您喜欢的颜色:");//输出请求参数的值:nationalout.println("您来自的国家:" + national + "<hr/>");out.println("</body>");out.println("</html>");}}</span></span>

2.10.2 Servlet的配置

配置Servlet有两种方法:
*在Servlet类中使用@WebServlet Annotation进行配置
*通过在web.xml文件中进行配置

@WebServlet的配置例子如上。
xml的配置例子:

<span style="font-size:18px;"><span style="font-size:18px;"><!-- 配置Servlet的名字 --><servlet><!-- 指定Servlet的名字,相当于指定@WebServlet的name属性 --><servlet-name>firstServlet</servlet-name><!-- 指定Servlet的实现类 --><servlet-class>lee.FirstServlet</servlet-class></servlet><!-- 配置Servlet的URL --><servlet-mapping><!-- 指定Servlet的名字 --><servlet-name>firstServlet</servlet-name><!-- 指定Servlet映射的URL地址,相当于指定@WebServlet的urlPatterns属性--><url-pattern>/aa</url-pattern></servlet-mapping></span></span>

2.10.3 JSP/Servlet的生命周期

Servlet的生命周期:
->创建实例成功->(调用init()方法)完成初始化->响应客户端请求->(调用destroy()方法)资源回收完成->实例化销毁->

2.10.4 load-on-startup Servlet

创建Servlet有两个时机:
1、用户请求之时
2、应用启动之时
应用启动时创建的Servlet,用于提供后台服务:
配置load-on-startup的Servlet有两种方式:
*在web.xml文件中通过<servlet../>元素的<load-on-startup.../>子元素进行配置。
*通过@WebServlet Annotation的loadOnStartup属性指定。
<load-on-startup.../>元素或loadOnStartup属性都只接收一个整型值,这个整型值越小,Servlet就越优先实例化。
例子:每隔一秒打印出当前时间的Servlet:
import javax.servlet.http.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.Date;

@WebServlet(loadOnStartup=1)
public class TimerServlet extends HttpServlet
{
public void init(ServletConfig config)throws ServletException
{
super.init(config);
Timer t = new Timer(1000,new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(new Date());
}
});
t.start();
}
}
也可以在web.xml中配置load-on-startup Servlet:
<servlet> 
<!-- Servlet名 -->
 <servlet-name>timerServlet</servlet-name> 
<!-- Servlet的实现类 -->
 <servlet-class>lee.TimerServlet</servlet-class> 
<!-- 配置应用启动时,创建Servlet实例 ,相当于指定@WebServlet的loadOnStartup属性-->
 <load-on-startup>1</load-on-startup> 
</servlet>

2.10.5 访问Servlet的配置参数

为Servlet配置参数有两种方式:
*通过@Webservlet的initParams属性来指定
*通过在web.xml文件的<servlet.../>元素中添加<init-param.../>子元素来指定。
访问Servlet配置参数通过ServletConfig对象完成,ServletConfig提供如下方法。
*java.lang.String getInitParameter(java.lang.String name):用于获取初始化参数。
例子:
import java.sql.*;
import javax.servlet.http.*;
import javax.servlet.*;
import javax.servlet.annotation.*;
import java.io.*;


@WebServlet(name="testServlet"
, urlPatterns={"/testServlet"}
, initParams={
@WebInitParam(name="driver", value="com.mysql.jdbc.Driver"),
@WebInitParam(name="url", value="jdbc:mysql://localhost:3306/javaee"),
@WebInitParam(name="user", value="root"),
@WebInitParam(name="pass", value="32147")})
public class TestServlet extends HttpServlet
{
//重写init方法,
public void init(ServletConfig config)
throws ServletException
{
//...
}
//响应客户端请求的方法
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,java.io.IOException
{
try
{
//获取ServletConfig对象
ServletConfig config = getServletConfig();
//通过ServletConfig对象获取配置参数:dirver
String driver = config.getInitParameter("driver");
//通过ServletConfig对象获取配置参数:url
String url = config.getInitParameter("url");
//通过ServletConfig对象获取配置参数:user
String user = config.getInitParameter("user");
//通过ServletConfig对象获取配置参数:pass
String pass = config.getInitParameter("pass");
//...
}
catch (Exception e)
{
e.printStackTrace();

}
}
@WebInitParam指定name和value属性。
web.xml中<init-param.../>元素有两个子元素:
param-name和param-value
例子:
        <servlet>
<!-- 配置Servlet名 -->
<servlet-name>testServlet</servlet-name>
<!-- 指定Servlet的实现类 -->
<servlet-class>lee.TestServlet</servlet-class>
<!-- 配置Servlet的初始化参数:driver -->
<init-param>
<param-name>driver</param-name>
<param-value>com.mysql.jdbc.Driver</param-value>
</init-param>
<!-- 配置Servlet的初始化参数:url -->
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/javaee</param-value>
</init-param>
<!-- 配置Servlet的初始化参数:user -->
<init-param>
<param-name>user</param-name>
<param-value>root</param-value>
</init-param>
<!-- 配置Servlet的初始化参数:pass -->
<init-param>
<param-name>pass</param-name>
<param-value>32147</param-value>
</init-param>
</servlet>
<servlet-mapping>
<!-- 确定Servlet名 -->
<servlet-name>testServlet</servlet-name>
<!-- 配置Servlet映射的URL -->
<url-pattern>/testServlet</url-pattern>
</servlet-mapping>

2.10.6 使用Servlet作为控制器



mvc例子:
1)login.jsp
<%@ page contentType="text/html; charset=GBK" language="java" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 用户登录 </title>
<meta name="website" content="http://www.crazyit.org" />
</head>
<body>
<!-- 输出出错提示 -->
<span style="color:red;font-weight:bold">
<%
if (request.getAttribute("err") != null)
{
out.println(request.getAttribute("err") + "<br/>");
}
%>
</span>
请输入用户名和密码:
<!-- 登录表单,该表单提交到一个Servlet -->
<form id="login" method="post" action="login">
用户名:<input type="text" name="username"/><br/>
密  码:<input type="password" name="pass"/><br/>
<input type="submit" value="登录"/><br/>
</form>
</body>
</html>
2)LoginServlet.java
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.PrintWriter;
import java.io.IOException;
import java.sql.*;
@WebServlet(name="login"
, urlPatterns={"/login"})
public class LoginServlet extends HttpServlet
{
//响应客户端请求的方法
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,java.io.IOException
{
String errMsg = "";
//Servlet本身并不输出响应到客户端,因此必须将请求转发
RequestDispatcher rd;
//获取请求参数
String username = request.getParameter("username");
String pass = request.getParameter("pass");
try
{
//Servlet本身,并不执行任何的业务逻辑处理,它调用JavaBean处理用户请求
DbDao dd = new DbDao("com.mysql.jdbc.Driver",
"jdbc:mysql://localhost:3306/liuyan","root","32147");
//查询结果集
ResultSet rs = dd.query("select pass from user_table "
+ "where name = ?", username);
if (rs.next())
{
//用户名和密码匹配
if (rs.getString("pass").equals(pass))
{
//获取session对象
HttpSession session = request.getSession(true);
//设置session属性,跟踪用户会话状态
session.setAttribute("name" , username);
//获取转发对象
rd = request.getRequestDispatcher("/welcome.jsp");
//转发请求
rd.forward(request,response);
}
else
{
//用户名和密码不匹配时
errMsg += "您的用户名密码不符合,请重新输入";
}
}
else
{
//用户名不存在时
errMsg += "您的用户名不存在,请先注册";
}
}
catch (Exception e)
{
e.printStackTrace();
}
//如果出错,转发到重新登录
if (errMsg != null && !errMsg.equals(""))
{
rd = request.getRequestDispatcher("/login.jsp");
request.setAttribute("err" , errMsg);
rd.forward(request,response);
}
}
}
3)DbDao.java
import java.sql.*;
public class DbDao 
{
private Connection conn;
private String driver;
private String url;
private String username;
private String pass;
public DbDao()
{
}
public DbDao(String driver , String url 
, String username , String pass)
{
this.driver = driver;
this.url = url;
this.username = username;
this.pass = pass; 
}
//下面是各个成员属性的setter和getter方法
public void setDriver(String driver) {
this.driver = driver; 
}
public void setUrl(String url) {
this.url = url; 
}
public void setUsername(String username) {
this.username = username; 
}
public void setPass(String pass) {
this.pass = pass; 
}
public String getDriver() {
return (this.driver); 
}
public String getUrl() {
return (this.url); 
}
public String getUsername() {
return (this.username); 
}
public String getPass() {
return (this.pass); 
}
//获取数据库连接
public Connection getConnection() throws Exception
{
if (conn == null)
{
Class.forName(this.driver);
conn = DriverManager.getConnection(url,username,
this. pass);
}
return conn;
}
//插入记录
public boolean insert(String sql , Object... args)
throws Exception
{
PreparedStatement pstmt = getConnection().prepareStatement(sql);
for (int i = 0; i < args.length ; i++ )
{
pstmt.setObject( i + 1 , args[i]);
}
if (pstmt.executeUpdate() != 1)
{
return false;
}
pstmt.close();
return true;
}
//执行查询
public ResultSet query(String sql , Object... args)
throws Exception
{
PreparedStatement pstmt = getConnection().prepareStatement(sql);
for (int i = 0; i < args.length ; i++ )
{
pstmt.setObject( i + 1 , args[i]);
}
return pstmt.executeQuery();
}
//执行修改
public void modify(String sql , Object... args)
throws Exception
{
PreparedStatement pstmt = getConnection().prepareStatement(sql);
for (int i = 0; i < args.length ; i++ )
{
pstmt.setObject( i + 1 , args[i]);
}
pstmt.executeUpdate();
pstmt.close();
}
//关闭数据库连接的方法
public void closeConn()
throws Exception
{
if (conn != null && !conn.isClosed())
{
conn.close();
}
}
}
M:Model,即模型,对应Javabean。
V:View,即视图,对应JSP页面。
C:Controller,即控制器,对应Servlet。














0 0
原创粉丝点击