Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
基本概念下手,讓我們來(lái)創(chuàng)建一個(gè)簡(jiǎn)單的表,并在表中創(chuàng)建幾條記錄。
創(chuàng)建測(cè)試數(shù)據(jù)
接下來(lái)我們?cè)?MySQL 中創(chuàng)建 RUNOOB 數(shù)據(jù)庫(kù),并創(chuàng)建 websites 數(shù)據(jù)表,表結(jié)構(gòu)如下:
CREATE TABLE `websites` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` char(20) NOT NULL DEFAULT '' COMMENT '站點(diǎn)名稱(chēng)', `url` varchar(255) NOT NULL DEFAULT '', `alexa` int(11) NOT NULL DEFAULT '0' COMMENT 'Alexa 排名', `country` char(10) NOT NULL DEFAULT '' COMMENT '國(guó)家', PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
插入一些數(shù)據(jù):
INSERT INTO `websites` VALUES ('1', 'Google', 'https://www.google.cm/', '1', 'USA'), ('2', '淘寶', 'https://www.taobao.com/', '13', 'CN'), ('3', '菜鳥(niǎo)教程', 'http://www.runoob.com', '5892', ''), ('4', '微博', 'http://weibo.com/', '20', 'CN'), ('5', 'Facebook', 'https://www.facebook.com/', '3', 'USA');
訪問(wèn)數(shù)據(jù)庫(kù)
下面的實(shí)例演示了如何使用 Servlet 訪問(wèn) RUNOOB 數(shù)據(jù)庫(kù)。
package com.runoob.test;import java.io.IOException;import java.io.PrintWriter;import java.sql.*;import javax.servlet.ServletException;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * Servlet implementation class DatabaseAccess */@WebServlet("/DatabaseAccess")public class DatabaseAccess extends HttpServlet { private static final long serialVersionUID=1L; // JDBC 驅(qū)動(dòng)名及數(shù)據(jù)庫(kù) URL static final String JDBC_DRIVER="com.mysql.jdbc.Driver"; static final String DB_URL="jdbc:mysql://localhost:3306/RUNOOB"; // 數(shù)據(jù)庫(kù)的用戶(hù)名與密碼,需要根據(jù)自己的設(shè)置 static final String USER="root"; static final String PASS="123456"; /** * @see HttpServlet#HttpServlet() */ public DatabaseAccess() { super(); // TODO Auto-generated constructor stub } /** * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Connection conn=null; Statement stmt=null; // 設(shè)置響應(yīng)內(nèi)容類(lèi)型 response.setContentType("text/html;charset=UTF-8"); PrintWriter out=response.getWriter(); String title="Servlet Mysql 測(cè)試 - 菜鳥(niǎo)教程"; String docType="<!DOCTYPE html>\n"; out.println(docType + "<html>\n" + "<head><title>" + title + "</title></head>\n" + "<body bgcolor=\"#f0f0f0\">\n" + "<h1 align=\"center\">" + title + "</h1>\n"); try{ // 注冊(cè) JDBC 驅(qū)動(dòng)器 Class.forName("com.mysql.jdbc.Driver"); // 打開(kāi)一個(gè)連接 conn=DriverManager.getConnection(DB_URL,USER,PASS); // 執(zhí)行 SQL 查詢(xún) stmt=conn.createStatement(); String sql; sql="SELECT id, name, url FROM websites"; ResultSet rs=stmt.executeQuery(sql); // 展開(kāi)結(jié)果集數(shù)據(jù)庫(kù) while(rs.next()){ // 通過(guò)字段檢索 int id=rs.getInt("id"); String name=rs.getString("name"); String url=rs.getString("url"); // 輸出數(shù)據(jù) out.println("ID: " + id); out.println(", 站點(diǎn)名稱(chēng): " + name); out.println(", 站點(diǎn) URL: " + url); out.println("<br />"); } out.println("</body></html>"); // 完成后關(guān)閉 rs.close(); stmt.close(); conn.close(); } catch(SQLException se) { // 處理 JDBC 錯(cuò)誤 se.printStackTrace(); } catch(Exception e) { // 處理 Class.forName 錯(cuò)誤 e.printStackTrace(); }finally{ // 最后是用于關(guān)閉資源的塊 try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doGet(request, response); }}
現(xiàn)在讓我們來(lái)編譯上面的 Servlet,并在 web.xml 文件中創(chuàng)建以下條目:
.... <servlet> <servlet-name>DatabaseAccess</servlet-name> <servlet-class>com.runoob.test.DatabaseAccess</servlet-class> </servlet> <servlet-mapping> <servlet-name>DatabaseAccess</servlet-name> <url-pattern>/TomcatTest/DatabaseAccess</url-pattern> </servlet-mapping>....
ervlet里面的方法(也叫Servlet中的生命周期):是因?yàn)镾ervlet方法牽扯到Servlet的生命周期。
如何使用瀏覽器訪問(wèn)Servlet的實(shí)現(xiàn)類(lèi)
因?yàn)镾ervlet實(shí)際上是接口,我們?cè)L問(wèn)的其實(shí)是Servlet的實(shí)現(xiàn)類(lèi)
首先我們需要配置文件設(shè)置一下,當(dāng)我們使用瀏覽器服務(wù)器的時(shí)候
package cn.itcast.web.servlet;
import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletDemo2 implements Servlet{
/**
* 銷(xiāo)毀方法
* 在服務(wù)器正常關(guān)閉時(shí),執(zhí)行,執(zhí)行一次。
*/
@Override
public void destroy() {
System.out.println("destroy...");
}
/**
* 獲取ServletConfig對(duì)象:其實(shí)就是Servlet的配置對(duì)象
*
*/
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/**
* 獲取Servlet的一些信息,版本,作者等待
*/
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
/**
* 初始化方法
* 在Servlet被創(chuàng)建時(shí),執(zhí)行。只會(huì)執(zhí)行一次。
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("init...");
}
/**
* 提供服務(wù)的方法
* 每一次Servlet被訪問(wèn)時(shí),執(zhí)行。執(zhí)行多次
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service...");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
<display-name>Project1</display-name>
<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>
<!-- 配置Servlet -->
<servlet>
<servlet-name>demo2</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo2</servlet-name>
<url-pattern>/demo2</url-pattern>
</servlet-mapping>
</web-app>
面已經(jīng)介紹了HttpServletResponse響應(yīng)對(duì)象中的一些常用方法,這一小節(jié)介紹如何使用HttpServletResponse響應(yīng)對(duì)象,將結(jié)果返回給瀏覽器客戶(hù)端。
使用Servlet返回HTML內(nèi)容給客戶(hù)端,是一個(gè)比較常見(jiàn)的功能,因?yàn)镾ervlet本來(lái)就是用于JavaWeb開(kāi)發(fā)的,而HTML就是Web開(kāi)發(fā)的三大核心語(yǔ)言之一。這里給出一個(gè)響應(yīng)HTML內(nèi)容給客戶(hù)端的案例代碼:
package com.gitcode.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @version 1.0.0
* @Date: 2024/2/10 20:20
* @Author ZhuYouBin
* @Description:
*/
public class HtmlResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 響應(yīng)HTML內(nèi)容
response.setContentType("text/html;charset=UTF-8");
// 獲取輸出流
PrintWriter writer=response.getWriter();
// 輸出HTML內(nèi)容
writer.println("<!DOCTYPE html>");
writer.println("<html lang=\"en\">");
writer.println("<head>");
writer.println(" <meta charset=\"UTF-8\">");
writer.println(" <title>響應(yīng)HTML內(nèi)容</title>");
writer.println("</head>");
writer.println("<body>");
writer.println(" <h3>Hello World!你好,世界!</h3>");
writer.println("</body>");
writer.println("</html>");
// 關(guān)閉流
writer.close();
}
}
運(yùn)行結(jié)果如下所示:
JSON格式在實(shí)際的Web開(kāi)發(fā)中,可以說(shuō)是最常用的數(shù)據(jù)交互格式啦,在一些前后端分離的項(xiàng)目中,都是采用JSON來(lái)進(jìn)行數(shù)據(jù)交互的,所以這里給出一個(gè)響應(yīng)JSON內(nèi)容的案例代碼:
package com.gitcode.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @version 1.0.0
* @Date: 2024/2/10 20:20
* @Author ZhuYouBin
* @Description:
*/
public class JsonResponseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 響應(yīng)JSON內(nèi)容
response.setContentType("application/json;charset=UTF-8");
// 獲取輸出流
PrintWriter writer=response.getWriter();
// 輸出JSON內(nèi)容
writer.println("{");
writer.println(" \"username\":\"名字是Tom-2024\",");
writer.println(" \"password\":\"123456\"");
writer.println("}");
// 關(guān)閉流
writer.close();
}
}
運(yùn)行結(jié)果如下所示:
以上,就是使用HttpServletResponse對(duì)象返回HTML和JSON數(shù)據(jù)格式。
今天就到這里,未完待續(xù)~~
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。