提交 f571d241 编写于 作者: W wizardforcel

2019-11-11 19:09:14

上级 766896c7
......@@ -12,7 +12,7 @@ Apache Tomcat 是由 Apache 软件基金会(ASF)开发的开源 Java Servlet
以下 Web 应用使用 Java Servlet 将纯文本发送到客户端。 从资源目录中的文件中读取文本。
``java
```java
$ tree
.
├── pom.xml
......@@ -40,7 +40,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -107,7 +107,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ServletPlainText"/>
......@@ -117,7 +117,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`thermopylae.txt`
``java
```java
The Battle of Thermopylae was fought between an alliance of Greek city-states,
led by King Leonidas of Sparta, and the Persian Empire of Xerxes I over the
course of three days, during the second Persian invasion of Greece.
......@@ -128,7 +128,7 @@ course of three days, during the second Persian invasion of Greece.
`GetText.java`
``java
```java
package com.zetcode.web;
import com.zetcode.util.ReadTextUtil;
......@@ -160,28 +160,28 @@ public class GetText extends HttpServlet {
这是`GetText` servlet。 它从位于资源目​​录中的文本文件中读取数据,并将文本以纯文本格式发送到客户端。
``java
```java
response.setContentType("text/plain;charset=UTF-8");
```
我们将响应对象的内容类型设置为`text/plain`
``java
```java
ServletOutputStream sout = response.getOutputStream();
```
我们得到了`ServletOutputStream`,用于将字符文本发送到客户端。
``java
```java
String content = ReadTextUtil.getContents();
```
我们将文本读入`content`变量。
``java
```java
sout.print(content);
```
......@@ -190,7 +190,7 @@ sout.print(content);
`ReadTextUtil.java`
``java
```java
package com.zetcode.util;
import com.google.common.base.Charsets;
......@@ -225,14 +225,14 @@ public class ReadTextUtil {
`ReadTextUtil`是用于读取文件内容的实用程序类。
``java
```java
URL url = ReadTextUtil.class.getClassLoader().getResource(fileName);
```
我们使用`getResource()`方法获取文件资源。
``java
```java
data = Files.toString(new File(url.toURI()), Charsets.UTF_8);
```
......@@ -241,7 +241,7 @@ data = Files.toString(new File(url.toURI()), Charsets.UTF_8);
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -258,7 +258,7 @@ data = Files.toString(new File(url.toURI()), Charsets.UTF_8);
这是主页。 它包含一个调用`GetText` servlet 的链接。
``java
```java
$ curl -I localhost:8084/ServletPlainText/GetText
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
......
......@@ -18,7 +18,7 @@ JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。
以下 Web 应用使用 Java Servlet 将数据(城市列表)以 JSON 格式发送到客户端。
``java
```java
$ tree
.
├── pom.xml
......@@ -45,7 +45,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -106,7 +106,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ServletJson"/>
......@@ -116,7 +116,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`City.java`
``java
```java
package com.zetcode.bean;
import java.util.Objects;
......@@ -194,7 +194,7 @@ public class City {
`GetCities.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.City;
......@@ -233,28 +233,28 @@ public class GetCities extends HttpServlet {
这是`GetCities` servlet。 它从服务类检索数据,并将它们以 JSON 格式返回给客户端。
``java
```java
response.setContentType("application/json;charset=UTF-8");
```
我们将响应对象的内容类型设置为`application/json`
``java
```java
ServletOutputStream out = response.getOutputStream();
```
我们得到了`ServletOutputStream`,用于将数据发送到客户端。
``java
```java
List<City> cities = new CityService().getCities();
```
`CityService`中,我们可以获得城市列表。
``java
```java
JsonConverter converter = new JsonConverter();
String output = converter.convertToJson(cities);
......@@ -262,7 +262,7 @@ String output = converter.convertToJson(cities);
我们使用`JsonConverter`将城市列表转换为 JSON 字符串。
``java
```java
out.print(output);
```
......@@ -271,7 +271,7 @@ JSON 字符串被写入`ServletOutputStream`。
`ICityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -288,7 +288,7 @@ public interface ICityService {
`CityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -318,7 +318,7 @@ public class CityService implements ICityService {
`ICityDao.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.bean.City;
......@@ -335,7 +335,7 @@ public interface ICityDao {
`CityDao.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.bean.City;
......@@ -368,7 +368,7 @@ public class CityDao implements ICityDao {
`JsonConverter.java`
``java
```java
package com.zetcode.util;
import com.google.gson.Gson;
......@@ -403,7 +403,7 @@ public class JsonConverter {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -424,7 +424,7 @@ public class JsonConverter {
`curl`是使用支持的协议之一从服务器传输数据或向服务器传输数据的工具。
``java
```java
$ curl localhost:8084/ServletJson/GetCities
[{"id":1,"name":"Bratislava","population":432000},{"id":2,"name":"Budapest","population":1759000},
{"id":3,"name":"Prague","population":1280000},{"id":4,"name":"Warsaw","population":1748000},
......@@ -439,7 +439,7 @@ $ curl localhost:8084/ServletJson/GetCities
如果我们想命名返回的 JSON 数组,可以使用以下代码:
``java
```java
Gson gson = new GsonBuilder().create();
JsonArray jarray = gson.toJsonTree(cities).getAsJsonArray();
JsonObject jsonObject = new JsonObject();
......
......@@ -23,7 +23,7 @@ HTTP 标头允许客户端和服务器将附加信息与请求或响应一起传
`ShowHeaders.java`
``java
```java
package com.zetcode.web;
import java.io.IOException;
......@@ -75,35 +75,35 @@ public class ShowHeaders extends HttpServlet {
`ShowHeaders` servlet 找出客户端发送的 HTTP 标头,并将它们发送回 HTML 文件中。
``java
```java
PrintWriter out = response.getWriter()
```
我们直接写到`PrintWriter`。 请注意,虽然可以直接写,但现代 Java Web 应用使用 Thymeleaf,FreeMarker 或 JSP 之类的模板来创建 HTML 页面。
``java
```java
response.setContentType("text/html");
```
响应的内容类型设置为`text/html`
``java
```java
Enumeration<String> headerNames = request.getHeaderNames();
```
我们使用`getHeaderNames()`方法获得标题名称。 它返回字符串的枚举。
``java
```java
String headerName = headerNames.nextElement();
```
我们使用`nextElement()`方法从枚举中获取下一个标头名称。
``java
```java
String headerValue = request.getHeader(headerName);
```
......@@ -116,7 +116,7 @@ String headerValue = request.getHeader(headerName);
`showHeaders.jsp`
``java
```java
<%@ taglib prefix='c' uri='http://java.sun.com/jsp/jstl/core' %>
<!DOCTYPE html>
<html lang="en">
......@@ -137,7 +137,7 @@ String headerValue = request.getHeader(headerName);
JSP 文件具有`header`隐式对象,该对象是标头名称及其值的映射。
``java
```java
<c:forEach var="nextHeader" items="${header}">
<li><c:out value="${nextHeader.key}" /> = <c:out value="${nextHeader.value}" /></li>
</c:forEach>
......
......@@ -20,7 +20,7 @@ Bootstrap 是 HTML,CSS 和 JS 框架,用于在 Web 上开发响应式,移
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -76,7 +76,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`javax.servlet-api`依赖性是用于构建 Java Servlet 的库。 `freemarker`工件用于 FreeMarker 模板引擎。 `maven-war-plugin`收集 Web 应用的所有工件依赖项,类和资源,并将它们打包到 Web 应用存档(WAR)中。
``java
```java
$ tree
.
├── pom.xml
......@@ -108,7 +108,7 @@ $ tree
`web.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -192,7 +192,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/FormCheckBox"/>
......@@ -202,7 +202,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -240,7 +240,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`index.html`文件是我们应用的主页。 它包含一个带文本输入和复选框的 HTML 表单。 页面外观是使用 Bootstrap 库创建的。
``java
```java
<input type="hidden" name="action" value="show">
```
......@@ -249,7 +249,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`FormFilter.java`
``java
```java
package com.zetcode.filter;
import java.io.IOException;
......@@ -301,14 +301,14 @@ public class FormFilter implements Filter {
`FormFilter`在到达`MyController` Servlet 之前先处理请求。 它从请求中检索所有参数并进行验证。 我们需要确保值不为 null 或为空。
``java
```java
Map<String, String[]> params = request.getParameterMap();
```
我们使用`getParameterMap()`方法从请求中获取所有参数。
``java
```java
params.keySet().stream().forEach(key -> {
String value = params.get(key)[0];
......@@ -322,7 +322,7 @@ params.keySet().stream().forEach(key -> {
我们需要将请求参数变成请求属性。 如果请求的属性不为 null 或为空,则将其设置为该属性。 这些属性可供 FreeMarker 模板引擎处理。
``java
```java
chain.doFilter(request, response);
```
......@@ -331,7 +331,7 @@ chain.doFilter(request, response);
`MyController.java`
``java
```java
package com.zetcode.web;
import com.zetcode.util.Validate;
......@@ -374,14 +374,14 @@ public class MyController extends HttpServlet {
`MyController` Servlet 将处理由过滤器处理的请求。
``java
```java
@WebServlet(name = "MyController", urlPatterns = {"/MyController"})
```
`@WebServlet`批注将具有`MyController` URL 模式的请求映射到`MyController` servlet。
``java
```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
......@@ -390,14 +390,14 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
该请求是一个 GET 请求,因此我们以`doGet()`方法为其提供服务。
``java
```java
response.setContentType("text/html;charset=UTF-8");
```
使用`setContentType()`方法,我们设置内容类型(HTML)和字符集。
``java
```java
RequestDispatcher dispatcher = request.getRequestDispatcher(path);
dispatcher.forward(request, response);
......@@ -407,7 +407,7 @@ dispatcher.forward(request, response);
`show.ftl`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -430,14 +430,14 @@ dispatcher.forward(request, response);
这是`show.ftl`模板。 两个属性传递给模板:`adult``name`。 FreeMarker 使用`${}`语法来获取请求属性的值。
``java
```java
<#if adult??>
```
使用`#if`指令,我们检查`adult`属性是否已设置。 `??`判断左侧操作数的值是否丢失。
``java
```java
<p>${name!"Guest"} is adult</p>
```
......@@ -446,7 +446,7 @@ dispatcher.forward(request, response);
`unknown.ftl`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -16,7 +16,7 @@ Eclipse Jetty 是 Java HTTP 服务器和 Java Servlet 容器。 Jetty 可以轻
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -68,7 +68,7 @@ Eclipse Jetty 是 Java HTTP 服务器和 Java Servlet 容器。 Jetty 可以轻
`javax.servlet-api`依赖性是用于构建 Java Servlet 的库。 `maven-war-plugin`收集 Web 应用的所有工件依赖项,类和资源,并将它们打包到 Web 应用存档(WAR)中。 `jetty-maven-plugin`插件对于使用 Jetty 服务器进行快速开发和测试非常有用。
``java
```java
pom.xml
src
├───main
......@@ -90,7 +90,7 @@ src
`webapp/index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -109,7 +109,7 @@ src
`com/zetcode/SendImageServlet.java`
``java
```java
package com.zetcode;
import javax.servlet.ServletContext;
......@@ -159,14 +159,14 @@ public class SendImageServlet extends HttpServlet {
`SendImageServlet` Servlet 将图像文件返回给客户端。
``java
```java
@WebServlet(name = "SendImageServlet", urlPatterns = {"/image"})
```
`@WebServlet`批注将具有`image` URL 模式的请求映射到`SendImageServlet` servlet。
``java
```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
......@@ -175,28 +175,28 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
该请求是一个 GET 请求,因此我们以`doGet()`方法为其提供服务。
``java
```java
ServletContext sc = getServletContext();
```
我们得到`ServletContext`,其中包含 servlet 用于与其 servlet 容器进行通信的一组方法,例如,获取文件的 MIME 类型,调度请求或写入日志文件。
``java
```java
try (InputStream is = sc.getResourceAsStream(&quoimg/sid.jpg")) {
```
我们使用`getResourceAsStream()`获得图像资源流。
``java
```java
OutputStream os = response.getOutputStream();
```
我们得到 servlet 输出流。 我们将图像数据写入此流。 容器负责关闭 servlet 输出流。
``java
```java
if (is == null) {
response.setContentType("text/plain");
......@@ -207,14 +207,14 @@ if (is == null) {
如果无法打开图像输入流,则会将错误消息发送回客户端。
``java
```java
response.setContentType("image/png");
```
图片为 PNG 格式; 因此,我们将响应的内容类型设置为`image/png`
``java
```java
byte[] buffer = new byte[1024];
int bytesRead;
......@@ -229,7 +229,7 @@ while ((bytesRead = is.read(buffer)) != -1) {
如果成功打开了图像输入流,我们将读取数据并将其写入 servlet 输出流。 我们将响应内容类型设置为`image/png`
``java
```java
$ mvn jetty:run
```
......
......@@ -22,7 +22,7 @@ Gson 是一个开放源代码 Java 库,用于将 Java 对象序列化和反序
以下 Web 应用使用 Java Servlet 将数据(城市列表)以 JSON 格式发送到客户端。 JQuery 用于执行请求并动态构建 HTML 列表。
``java
```java
├── pom.xml
└── src
├── main
......@@ -50,7 +50,7 @@ Gson 是一个开放源代码 Java 库,用于将 Java 对象序列化和反序
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -110,7 +110,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServleJqueryList"/>
......@@ -120,7 +120,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`City.java`
``java
```java
package com.zetcode.bean;
import com.google.gson.annotations.Expose;
......@@ -180,7 +180,7 @@ public class City {
`GetCities.java`
``java
```java
package com.zetcode.web;
import com.google.gson.Gson;
......@@ -222,28 +222,28 @@ public class GetCities extends HttpServlet {
这是`GetCities` servlet。 它从服务类检索数据,并将它们以 JSON 格式返回给客户端。
``java
```java
response.setContentType("application/json;charset=UTF-8");
```
我们将响应对象的内容类型设置为`application/json`
``java
```java
try (PrintWriter out = response.getWriter()) {
```
我们得到了`PrintWriter`,用于将字符文本发送到客户端。
``java
```java
List<City> cities = CityService.getCities();
```
`CityService`中,我们可以获得城市列表。
``java
```java
Gson gson = new GsonBuilder()
.excludeFieldsWithoutExposeAnnotation()
.create();
......@@ -252,7 +252,7 @@ Gson gson = new GsonBuilder()
我们创建并配置`Gson`类,这是使用 Gson 的主要类。 `excludeFieldsWithoutExposeAnnotation()`启用`@Expose`批注。
``java
```java
out.print(gson.toJson(cities));
```
......@@ -261,7 +261,7 @@ out.print(gson.toJson(cities));
`CityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -293,7 +293,7 @@ public class CityService {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -331,21 +331,21 @@ public class CityService {
这是主页。
``java
```java
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
```
我们包括 JQuery 库。
``java
```java
<button id="mybtn">Get cities</button>
```
该按钮执行请求。
``java
```java
<div>
<ul id="output">
......@@ -356,7 +356,7 @@ public class CityService {
返回的数据将被写入这些元素内。
``java
```java
$('#mybtn').click(function () {
$.getJSON('GetCities', function (data) {
......
......@@ -16,7 +16,7 @@ JDBCTemplate 是用于简化 JDBC 编程的 Spring 库。 它处理乏味且容
我们的应用将管理用户。 它允许添加新用户,对其进行修改,删除它并列出所有可用用户。
``java
```java
mysql> CREATE TABLE Users(Id INTEGER PRIMARY KEY AUTO_INCREMENT,
Firstname TEXT, Lastname TEXT, Email TEXT);
......@@ -26,7 +26,7 @@ mysql> CREATE TABLE Users(Id INTEGER PRIMARY KEY AUTO_INCREMENT,
`Excerpt from pom.xml`
``java
```java
<dependencies>
<dependency>
<groupId>javax</groupId>
......@@ -61,7 +61,7 @@ mysql> CREATE TABLE Users(Id INTEGER PRIMARY KEY AUTO_INCREMENT,
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/ServletFreemarkerEx">
......@@ -83,7 +83,7 @@ mysql> CREATE TABLE Users(Id INTEGER PRIMARY KEY AUTO_INCREMENT,
`web.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
......@@ -169,7 +169,7 @@ mysql> CREATE TABLE Users(Id INTEGER PRIMARY KEY AUTO_INCREMENT,
`User.java`
``java
```java
package com.zetcode.bean;
public class User {
......@@ -218,7 +218,7 @@ public class User {
`ServiceLocator.java`
``java
```java
package com.zetcode.util;
import java.util.logging.Level;
......@@ -253,7 +253,7 @@ public class ServiceLocator {
`DatabaseService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.User;
......@@ -328,7 +328,7 @@ public class DatabaseService {
`DatabaseService`中,我们有利用 JDBCTemplate 库执行数据库操作的方法。
``java
```java
public static User getUserById(Long id) {
String sql = "SELECT * FROM Users WHERE Id = ?";
......@@ -344,7 +344,7 @@ public static User getUserById(Long id) {
`getUserById()`方法返回由其 ID 标识的用户。 `queryForObject()`运行指定的 SQL 语句并返回一个对象。 `BeanPropertyRowMapper`将返回的行转换为目标类(用户)。
``java
```java
public static List<User> getAllUsers() {
String sql = "SELECT * FROM Users";
......@@ -363,7 +363,7 @@ public static List<User> getAllUsers() {
`MyController.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.User;
......@@ -470,7 +470,7 @@ public class MyController extends HttpServlet {
`MyController`是一个控制器类,用于管理传入的请求并委托给特定的服务方法。 我们有两种方法:`doGet()`处理 HTTP GET 请求,`doPost()`处理 HTTP POST 请求。
``java
```java
private static final String ADD_USER_VIEW = "addUser.ftl";
private static final String UPDATE_USER_VIEW = "updateUser.ftl";
private static final String LIST_USERS_VIEW = "listUsers.ftl";
......@@ -479,7 +479,7 @@ private static final String LIST_USERS_VIEW = "listUsers.ftl";
这是三个 FreeMarker 模板视图。
``java
```java
private static final String USER_ADDED_VIEW = "userAdded.html";
private static final String USER_DELETED_VIEW = "userDeleted.html";
private static final String USER_MODIFIED_VIEW = "userUpdated.html";
......@@ -488,7 +488,7 @@ private static final String USER_MODIFIED_VIEW = "userUpdated.html";
在这里,我们有三个 HTML 视图。 它们用于确认我们的任务。
``java
```java
private static final String DELETE_ACTION = "deleteUser";
private static final String ADD_ACTION = "addUser";
private static final String UPDATE_ACTION = "updateUser";
......@@ -498,7 +498,7 @@ private static final String LIST_ACTION = "listUsers";
我们有四个不同的操作:删除用户,添加新用户,更新用户以及列出所有用户。
``java
```java
if (DELETE_ACTION.equals(action)) {
Long userId = Long.parseLong(request.getParameter("userId"));
DatabaseService.deleteUser(userId);
......@@ -510,7 +510,7 @@ if (DELETE_ACTION.equals(action)) {
收到删除操作后,我们从请求中找到 ID,然后调用`DatabaseService's` `deleteUser()`方法。 然后选择一个视图。
``java
```java
} else if (UPDATE_ACTION.equals(action)) {
Long userId = Long.parseLong(request.getParameter("userId"));
......@@ -524,7 +524,7 @@ if (DELETE_ACTION.equals(action)) {
当我们单击更新链接时,将执行此代码。 从数据库中检索用户,并将`User`对象添加到请求对象。 `UPDATE_USER_VIEW`将应用转发到模板文件,该文件具有用于更新用户的形式。 提交表单后,将 POST 请求发送到控制器,并执行其`doPost()`方法。
``java
```java
} else if (LIST_ACTION.equals(action)) {
List<User> users = DatabaseService.getAllUsers();
......@@ -536,7 +536,7 @@ if (DELETE_ACTION.equals(action)) {
在这里,我们检索所有用户并将用户列表设置为请求对象。 我们选择`LIST_USERS_VIEW`视图。
``java
```java
response.sendRedirect(path);
```
......@@ -545,7 +545,7 @@ response.sendRedirect(path);
`addUser.ftl`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -580,7 +580,7 @@ response.sendRedirect(path);
`addUser.ftl`是一个模板文件,其中包含用于添加新用户的表单。
``java
```java
<form action="MyController?action=addUser" method="post">
```
......@@ -589,7 +589,7 @@ response.sendRedirect(path);
`updateUser.ftl`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -633,7 +633,7 @@ response.sendRedirect(path);
`addUser.ftl`模板文件包含用于更新特定用户的表单。
``java
```java
<style>
input[readonly] {
background-color:lightGray;
......@@ -644,7 +644,7 @@ response.sendRedirect(path);
这种 CSS 样式将浅色的只读输入标签的背景绘制为灰色。
``java
```java
<label for="id">Id:</label>
<input id="id" type="text" name="id" readonly value="${user.id}">
<br>
......@@ -655,7 +655,7 @@ ID 是一个只读参数。 `${user.id}`是一个 FreeMarker 插值,可解析
`listUsers.ftl`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -698,14 +698,14 @@ ID 是一个只读参数。 `${user.id}`是一个 FreeMarker 插值,可解析
`listUsers.ftl`模板文件列出了`Users`数据库表中的所有用户。
``java
```java
<#list users as user>
```
FreeMarker `#list`指令遍历`users`集合的所有元素。
``java
```java
<td>${user.id}</td>
<td>${user.firstName}</td>
<td>${user.lastName}</td>
......@@ -715,21 +715,21 @@ FreeMarker `#list`指令遍历`users`集合的所有元素。
这些 FreeMarker 插值显示用户数据。
``java
```java
<td><a href="MyController?action=updateUser&userId=${user.id}">Update</a></td>
```
该链接将更新操作发送到应用控制器; 它还发送要修改的用户的 ID。
``java
```java
<td><a href="MyController?action=deleteUser&userId=${user.id}">Delete</a></td>
```
该链接将删除操作发送到应用控制器。 它还发送要删除的用户的 ID。
``java
```java
<a href="MyController?action=addUser">Add new user</a>
```
......@@ -738,7 +738,7 @@ FreeMarker `#list`指令遍历`users`集合的所有元素。
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -757,7 +757,7 @@ FreeMarker `#list`指令遍历`users`集合的所有元素。
`userAdded.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -779,7 +779,7 @@ FreeMarker `#list`指令遍历`users`集合的所有元素。
`userDeleted.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -801,7 +801,7 @@ FreeMarker `#list`指令遍历`users`集合的所有元素。
`userUpdated.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -16,7 +16,7 @@ JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -90,7 +90,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -138,7 +138,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`index.html`文件中,我们在表单标签中使用`Autocomplete`组件。 `action`属性指向`showBug.jsp`页面,该页面显示所选的错误名称。
``java
```java
<link rel="stylesheet" href="//code.jquery.com/ui/1.12.1/themes/base/jquery-ui.css">
<script src="https://code.jquery.com/jquery-1.12.4.js"></script>
<script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
......@@ -147,7 +147,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
我们包括`Autocomplete`组件的 JavaScript 库和 CSS 样式。
``java
```java
<script>
$(function () {
......@@ -162,7 +162,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`Autocomplete`组件已创建。 `source`选项指向`Bugs` Servlet,该 Servlet 以 JSON 格式返回数据。 `minLength`选项指定用户在执行搜索之前必须键入的最少字符数。
``java
```java
<input id="bugs" name="bug">
```
......@@ -171,7 +171,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`showBug.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
......@@ -192,7 +192,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`bugs.csv`
``java
```java
Assasin bug, Avondale spider, Backswimmer,
Bamboo moth, Banana moth, Bed bug,
Black cocroach, Blue moon, Bumble Bee,
......@@ -215,7 +215,7 @@ Yellow Jacket, Yellow Admiral
`Bugs.java`
``java
```java
package com.zetcode.web;
import com.zetcode.service.ReadBugs;
......@@ -253,14 +253,14 @@ public class Bugs extends HttpServlet {
这是 Java Servlet,它接收带有名为`term`的参数的 GET 请求。 Servlet 读取错误名称列表,按检索到的术语对其进行过滤,然后将其转换为 JSON 字符串。
``java
```java
response.setContentType("application/json");
```
我们将响应类型设置为`application/json`
``java
```java
String term = request.getParameter("term");
String q = term.toLowerCase();
......@@ -268,7 +268,7 @@ String q = term.toLowerCase();
我们得到搜索词并将其更改为小写。
``java
```java
List<String> bugsList = ReadBugs.readAll(getServletContext());
List<String> filteredBugsList = Utils.filterListByTerm(bugsList, q);
String json = Utils.list2Json(filteredBugsList);
......@@ -277,7 +277,7 @@ String json = Utils.list2Json(filteredBugsList);
这三种方法读取数据,过滤数据并将其转换为 JSON。
``java
```java
response.getWriter().write(json);
```
......@@ -286,7 +286,7 @@ response.getWriter().write(json);
`ReadBugs.java`
``java
```java
package com.zetcode.service;
import com.opencsv.CSVReader;
......@@ -324,7 +324,7 @@ public class ReadBugs {
`readAll()`方法从 CSV 文件读取所有错误。 它使用 Opencsv 库来完成这项工作。 它将列表错误名称返回给调用者。
``java
```java
InputStream is = context.getResourceAsStream("/WEB-INF/bugs.csv");
```
......@@ -333,7 +333,7 @@ Servlet 上下文用于确定 CSV 文件的路径。
`Utils.java`
``java
```java
package com.zetcode.util;
import com.fasterxml.jackson.core.JsonProcessingException;
......@@ -372,7 +372,7 @@ public class Utils {
我们有一个`Utils`类,其中包含两个方法。 一个过滤数据,另一个将列表转换为 JSON。
``java
```java
List<String> matching = list.stream()
.filter(e -> e.toLowerCase().startsWith(term))
.collect(Collectors.toList());
......@@ -381,7 +381,7 @@ List<String> matching = list.stream()
使用 Java 8 流 API,我们按搜索词过滤数据。
``java
```java
try {
json = new ObjectMapper().writeValueAsString(list);
} catch (JsonProcessingException ex) {
......
......@@ -20,7 +20,7 @@ iText 是一个开放源代码库,用于在 Java 中创建和处理 PDF 文件
以下 Web 应用使用 Java Servlet 将 PDF 文件发送到客户端。 它从对象列表生成 PDF。
``java
```java
$ tree
.
├── pom.xml
......@@ -51,7 +51,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -111,7 +111,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletPdf"/>
......@@ -121,7 +121,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`City.java`
``java
```java
package com.zetcode.bean;
public class City {
......@@ -176,7 +176,7 @@ public class City {
`MyServlet.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.City;
......@@ -215,42 +215,42 @@ public class MyServlet extends HttpServlet {
这是`MyServlet` servlet。 它从服务类检索数据,从数据生成 PDF 文件,然后将 PDF 文件返回给客户端。
``java
```java
response.setContentType("application/pdf;charset=UTF-8");
```
我们将响应对象的内容类型设置为`application/pdf`
``java
```java
response.addHeader("Content-Disposition", "inline; filename=" + "cities.pdf");
```
`Content-Disposition`响应标头指示内容应在浏览器中显示为`inline`,即作为 Web 页面或 Web 页面的一部分,或作为`attachment`在本地下载和保存。 。 可选的`filename`伪指令指定传输文件的名称。
``java
```java
ServletOutputStream out = response.getOutputStream();
```
我们从响应对象获得`ServletOutputStream`
``java
```java
List<City> cities = CityService.getCities();
```
`CityService`中,我们可以获得城市列表。
``java
```java
List<City> cities = CityService.getCities();
```
`CityService`中,我们可以获得城市列表。
``java
```java
ByteArrayOutputStream baos = GeneratePdf.getPdfFile(cities);
baos.writeTo(out);
......@@ -260,7 +260,7 @@ baos.writeTo(out);
`CityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -292,7 +292,7 @@ public class CityService {
`GeneratePdf.java`
``java
```java
package com.zetcode.util;
import com.itextpdf.text.Document;
......@@ -379,28 +379,28 @@ public class GeneratePdf {
`GeneratePdf`根据提供的数据创建 PDF 文件。
``java
```java
ByteArrayOutputStream bout = new ByteArrayOutputStream();
```
数据将被写入`ByteArrayOutputStream``ByteArrayOutputStream`实现了一个输出流,其中数据被写入字节数组。
``java
```java
PdfPTable table = new PdfPTable(3);
```
我们将数据放在表格中; 为此,我们有`PdfPTable`类。 该表具有三列:ID,名称和人口。
``java
```java
Font headFont = FontFactory.getFont(FontFactory.HELVETICA_BOLD);
```
我们使用粗体 Helvetica 字体作为表标题。
``java
```java
PdfPCell hcell;
hcell = new PdfPCell(new Phrase("Id", headFont));
hcell.setHorizontalAlignment(Element.ALIGN_CENTER);
......@@ -410,14 +410,14 @@ table.addCell(hcell);
数据放置在表单元格内,由`PdfPCell`表示。 `setHorizontalAlignment()`方法使文本水平对齐。
``java
```java
PdfWriter.getInstance(document, bout);
```
使用`PdfWriter`,将文档写入`ByteArrayOutputStream`
``java
```java
document.open();
document.add(table);
......@@ -425,14 +425,14 @@ document.add(table);
该表将插入到 PDF 文档中。
``java
```java
document.close();
```
为了将数据写入`ByteArrayOutputStream`,必须关闭文档。
``java
```java
return bout;
```
......
......@@ -10,7 +10,7 @@ CSV(逗号分隔值)格式是在电子表格和数据库中使用的非常
在以下 Web 应用中,我们从 WAR 文件中的 CSV 文件读取数据,并将数据显示在网页中。 标记人口超过一亿的国家。
``java
```java
pom.xml
src
├───main
......@@ -38,7 +38,7 @@ src
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -105,7 +105,7 @@ src
`resources/countries.csv`
``java
```java
Name, Population
Slovakia,5429000
Norway,5271000
......@@ -126,7 +126,7 @@ Japan,126650000
`com/zetcode/bean/Country.java`
``java
```java
package com.zetcode.bean;
import com.opencsv.bean.CsvBindByName;
......@@ -185,7 +185,7 @@ public class Country {
这是一个`Country` bean,具有两个属性:`name``population`
``java
```java
@CsvBindByName
private String name;
......@@ -195,7 +195,7 @@ private String name;
`com/zetcode/CountryService.java`
``java
```java
package com.zetcode.service;
import com.opencsv.bean.CsvToBean;
......@@ -250,7 +250,7 @@ public class CountryService {
`CountryService`从 CSV 文件读取数据。
``java
```java
try (InputStream is = CountryService.class.getClassLoader()
.getResourceAsStream("countries.csv")) {
......@@ -258,7 +258,7 @@ try (InputStream is = CountryService.class.getClassLoader()
我们使用`getResourceAsStream()`方法将`InputStream`转换为`countries.csv`文件。
``java
```java
if (is == null) {
return Optional.empty();
......@@ -268,7 +268,7 @@ if (is == null) {
如果未打开输入流,则返回空`Optional`。 这用于避免`null`值。
``java
```java
HeaderColumnNameMappingStrategy<Country> strategy
= new HeaderColumnNameMappingStrategy<>();
strategy.setType(Country.class);
......@@ -277,7 +277,7 @@ strategy.setType(Country.class);
我们使用 Opencsv 的`HeaderColumnNameMappingStrategy``Country` bean 映射到 CSV 文件中的行。 每行都转换为一个 bean。 映射是在`@CsvBindByName`注释的帮助下完成的。
``java
```java
try (var br = new BufferedReader(
new InputStreamReader(is, StandardCharsets.UTF_8))) {
......@@ -296,7 +296,7 @@ try (var br = new BufferedReader(
`com/zetcode/web/ReadCountries.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.Country;
......@@ -344,7 +344,7 @@ public class ReadCountries extends HttpServlet {
`webapp/listCountries.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
......@@ -402,7 +402,7 @@ public class ReadCountries extends HttpServlet {
`listCountries.jsp`文件中,我们在 HTML 表中显示数据。
``java
```java
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
......@@ -410,14 +410,14 @@ public class ReadCountries extends HttpServlet {
我们使用两个 JSTL 标签库:核心库和格式库。
``java
```java
<c:forEach items="${countries}" var="count">
```
使用`&lt;c:forEach&gt;`标签,我们遍历`countries`对象。
``java
```java
<c:if test="${count.population > 100000000}">
<tr class="marked">
<td>
......@@ -435,7 +435,7 @@ public class ReadCountries extends HttpServlet {
`webapp/index.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
......@@ -454,7 +454,7 @@ public class ReadCountries extends HttpServlet {
`webapp/showError.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
......
......@@ -19,7 +19,7 @@ Servlet 映射是从`HttpServletRequest`实例获得的,该实例具有四种
在下面的示例中,我们使用`HttpServletMapping`查找有关 URL 映射的信息。 该示例在 Tomcat 上运行。 注意,我们必须选择具有 Servlet 4.0 API JAR 的最新 Tomcat 版本。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -44,7 +44,7 @@ $ tree
`MyServlet.java`
``java
```java
package com.zetcode;
import java.io.IOException;
......@@ -86,14 +86,14 @@ public class MyServlet extends HttpServlet {
我们获取映射信息,并将其作为文本数据发送给客户端。
``java
```java
@WebServlet(name = "MyServlet", urlPatterns = {"/getMessage"})
```
我们设置与`@WebServlet`声明绑定 servlet 的 URL 模式。
``java
```java
HttpServletMapping mapping = request.getHttpServletMapping();
String mapName = mapping.getMappingMatch().name();
String value = mapping.getMatchValue();
......@@ -104,7 +104,7 @@ String servletName = mapping.getServletName();
从请求对象中,我们获得`getHttpServletMapping()`的 servlet 映射。 我们调用所有四个方法。
``java
```java
StringBuilder builder = new StringBuilder();
builder.append("Mapping type: ").append(mapName)
.append("; Match value: ").append(value)
......@@ -115,7 +115,7 @@ builder.append("Mapping type: ").append(mapName)
根据数据,我们构建一个字符串。
``java
```java
ServletOutputStream out = response.getOutputStream();
out.println(builder.toString());
......@@ -125,7 +125,7 @@ out.println(builder.toString());
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -12,7 +12,7 @@ Apache Derby 是完全用 Java 实现的开源关系数据库。 它占地面积
`cars.sql`
``java
```java
CREATE TABLE CARS(ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
......@@ -29,7 +29,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
在我们的示例中,我们使用此数据库表。
``java
```java
<dependencies>
<dependency>
<groupId>javax</groupId>
......@@ -64,7 +64,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -100,7 +100,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
`GetCars.java`
``java
```java
package com.zetcode.web;
import com.zetcode.service.CarService;
......@@ -145,21 +145,21 @@ public class GetCars extends HttpServlet {
`GetCars` Java servlet 调用服务方法,该方法从 Derby 数据库表中检索数据。
``java
```java
response.setContentType("application/json");
```
我们将内容类型设置为`application/json`
``java
```java
JSONArray ar = CarService.getCarsJSON();
```
`getCarsJSON()`方法以 JSON 格式返回数据。
``java
```java
response.getWriter().write(ar.toJSONString());
```
......@@ -168,7 +168,7 @@ response.getWriter().write(ar.toJSONString());
`CarService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.web.GetCars;
......@@ -238,14 +238,14 @@ public class CarService {
`GetCars()`方法连接到 Derby 数据库并执行 SELECT 语句; 返回的数据将转换为 JSON。 JDBC 用于执行 SQL。
``java
```java
pst = con.prepareStatement("SELECT NAME, PRICE FROM Cars");
```
我们从表中检索两列:名称和价格。
``java
```java
jarray = SimpleJsonUtils.toJSON(rs);
```
......
......@@ -16,7 +16,7 @@ Servlet 是 Java 类,可响应特定类型的网络请求-最常见的是 HTTP
Java servlet 使用`ClientBuilder`创建一个`Client`,这是用于构建和执行客户端请求以使用返回的响应的流畅 API 的主要入口点。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -51,7 +51,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -124,7 +124,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletRestClient"/>
......@@ -136,7 +136,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`Location.java`
``java
```java
package com.zetcode.model;
public class Location {
......@@ -196,7 +196,7 @@ public class Location {
`Name.java`
``java
```java
package com.zetcode.model;
public class Name {
......@@ -245,7 +245,7 @@ public class Name {
`Person.java`
``java
```java
package com.zetcode.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
......@@ -306,7 +306,7 @@ public class Person {
`Person`类存储有关用户的数据,包括姓名,地址,电子邮件和性别。
``java
```java
@JsonIgnoreProperties(ignoreUnknown = true)
```
......@@ -315,7 +315,7 @@ public class Person {
`PersonsList.java`
``java
```java
package com.zetcode.model;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
......@@ -341,7 +341,7 @@ public class PersonsList {
`MyServlet.java`
``java
```java
package com.zetcode.web;
import com.zetcode.model.Person;
......@@ -376,7 +376,7 @@ public class MyServlet extends HttpServlet {
`PersonService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.model.Person;
......@@ -404,7 +404,7 @@ public class PersonService {
`PersonService`包含用于在`api.randomuser.me` Web 服务上执行查询的`fetchPeople()`方法。 该服务随机返回用户对象。
``java
```java
private static WebTarget resource = ClientBuilder.newBuilder()
.build().target("https://api.randomuser.me/");
......@@ -412,7 +412,7 @@ private static WebTarget resource = ClientBuilder.newBuilder()
使用`ClientBuilder`创建一个 Web 资源目标。 `api.randomuser.me`网站随机返回用户列表。
``java
```java
public static List<Person> fetchPeople(int offset, int num) {
PersonsList res = resource.queryParam("seed", 1)
.queryParam("results", num).queryParam("page", 1)
......@@ -426,7 +426,7 @@ public static List<Person> fetchPeople(int offset, int num) {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -444,7 +444,7 @@ public static List<Person> fetchPeople(int offset, int num) {
`show.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......
......@@ -18,7 +18,7 @@ Log4j 具有三个主要组件:记录器,附加器和布局。 记录器被
以下 Web 应用正在使用 Log4j 进行日志记录。 在 Servlet 3.0+应用中,Log4j 可以直接使用。 它在应用部署时自动启动,在应用取消部署时自动关闭。
``java
```java
$ tree
.
├── pom.xml
......@@ -45,7 +45,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -106,7 +106,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletLog4j"/>
......@@ -116,7 +116,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`log4j2.xml`
``java
```java
<?xml version="1.0" encoding="utf-8"?>
<Configuration status="info">
......@@ -157,7 +157,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`log4j2.xml`中配置 Log4j。 在我们的示例中,我们选择了 XML 文件格式。
``java
```java
<Properties>
<Property name="logdir">/home/janbodnar/tmp</Property>
<Property name="layout">%d [%t] %-5p %c - %m%n</Property>
......@@ -169,7 +169,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
模式布局由转换说明符组成。 每个说明符均以百分号开头,后跟可选的格式修饰符和强制转换字符。 `%d`输出记录事件的日期。 `%t`输出生成日志事件的线程的名称。 `%-5p`输出记录事件的级别,级别名称中至少要包含五个字符,并且这些字符必须对齐。 `%c`输出发布了记录事件的记录器的名称。 `%m`打印与日志记录事件关联的应用消息,`%n`是平台相关的行分隔符或多个字符。
``java
```java
<Appenders>
...
</Appenders>
......@@ -178,7 +178,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
追加项是定义日志消息保存位置的对象。 有几个可能的目的地,包括控制台,文件,数据库表或原型。
``java
```java
<RollingFile name="LOCALHOST"
fileName="${logdir}/localhost.log"
filePattern="${logdir}/localhost.%d{yyyy-MM-dd}-%i.log">
......@@ -191,7 +191,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
我们设置日志文件的位置。 我们使用滚动文件附加器,该附加器会自动滚动或归档当前日志文件,并继续记录新文件。 `PatternLayout`设置日志消息的布局。 如果存档数量达到十个,则`DefaultRolloverStrategy`会删除较旧的存档。
``java
```java
<Policies>
<TimeBasedTriggeringPolicy />
<SizeBasedTriggeringPolicy size="1 MB" />
......@@ -201,7 +201,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
触发策略在`Policies`标记中定义。 它们控制发生翻转的条件。 在这里,我们使用两个策略:`TimeBasedTriggeringPolicy``SizeBasedTriggeringPolicy``TimeBasedTriggeringPolicy`根据最具体的日期和时间模式开始翻转; 就我们而言,每小时 如果日志文件的大小达到 1 MB,则`SizeBasedTriggeringPolicy`开始翻转。
``java
```java
<Loggers>
<Logger name="com.zetcode"
......@@ -220,7 +220,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`MyServlet.java`
``java
```java
package com.zetcode.web;
import com.zetcode.service.MyService;
......@@ -259,21 +259,21 @@ public class MyServlet extends HttpServlet {
这是`MyServlet` servlet。 它调用服务方法并将文本数据发送回客户端。
``java
```java
final static Logger logger = LogManager.getLogger(MyService.class);
```
我们从`LogManager`获取记录器。
``java
```java
logger.info("MyServlet's doGet() called");
```
我们记录一条信息级别的消息。
``java
```java
MyService service = new MyService();
service.doWork();
......@@ -281,7 +281,7 @@ service.doWork();
我们称为虚拟服务方法。
``java
```java
PrintWriter out = response.getWriter();
out.print("MyServlet called");
......@@ -291,7 +291,7 @@ out.print("MyServlet called");
`MyService.java`
``java
```java
package com.zetcode.service;
import org.apache.logging.log4j.LogManager;
......@@ -313,7 +313,7 @@ public class MyService {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -329,7 +329,7 @@ public class MyService {
主页包含一个调用`MyServlet`的链接。
``java
```java
$ cat localhost.log
2017-11-14 16:50:30,157 [http-nio-8084-exec-5] INFO com.zetcode.service.MyService- MyServlet's doGet() called
2017-11-14 16:50:31,044 [http-nio-8084-exec-5] INFO com.zetcode.service.MyService- MyService's doWork() called
......
......@@ -16,7 +16,7 @@ JFreeChart 是流行的 Java 图表库。 它允许创建各种交互式和非
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -77,7 +77,7 @@ JFreeChart 是流行的 Java 图表库。 它允许创建各种交互式和非
`maven-war-plugin`收集 Web 应用的所有工件依赖项,类和资源,并将它们打包到 Web 应用存档(WAR)中。 `jetty-maven-plugin`允许我们与`mvn jetty:run`一起运行嵌入式 Jetty 服务器。
``java
```java
pom.xml
src
├───main
......@@ -98,7 +98,7 @@ src
`webapp/index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -117,7 +117,7 @@ src
`com/zetcode/web/DoChart.java`
``java
```java
package com.zetcode.web;
import org.jfree.chart.ChartFactory;
......@@ -173,14 +173,14 @@ public class DoChart extends HttpServlet {
`DoChart` Servlet 将饼图返回给客户端。
``java
```java
@WebServlet(name = "DoChart", urlPatterns = {"/showChart"})
```
`@WebServlet`批注将具有`showChart` URL 模式的请求映射到`DoChart` servlet。
``java
```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
......@@ -189,28 +189,28 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
该请求是一个 GET 请求,因此我们以`doGet()`方法为其提供服务。
``java
```java
response.setContentType("image/png");
```
该图表用作 PNG 格式的图像; 因此,我们将响应的内容类型设置为`image/png`
``java
```java
OutputStream os = response.getOutputStream();
```
`response`对象获得`OutputStream`。 我们通过写 servlet 的`OutputStream`将图表提供给客户端。
``java
```java
ChartUtils.writeChartAsPNG(os, chart, width, height);
```
`ChartUtils.writeChartAsPNG()`将图表转换为 PNG 文件,并将其写入输出流。
``java
```java
public JFreeChart getChart() {
var dataset = new DefaultPieDataset();
......@@ -233,7 +233,7 @@ public JFreeChart getChart() {
`getChart()`方法中,我们生成图表。 `DefaultPieDataset`包含饼图的数据。
``java
```java
JFreeChart chart = ChartFactory.createPieChart("Popular destinations",
dataset, true, false, false);
......@@ -245,7 +245,7 @@ JFreeChart chart = ChartFactory.createPieChart("Popular destinations",
以下代码是发送条形图的替代解决方案。
``java
```java
public JFreeChart getChart() {
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
......@@ -271,7 +271,7 @@ public JFreeChart getChart() {
使用`ChartFactory.createBarChart()`创建条形图。
``java
```java
$ mvn jetty:run
```
......
......@@ -18,7 +18,7 @@ Pure.css 是一组小型的响应式 CSS 模块,可以在每个 Web 项目中
在以下 Web 应用中,我们有一个简单的 Web 表单。 我们向 Servlet 发送了一个名称参数。 如果参数为空,则通过`ServletConfig`读取初始化参数。 在示例中,我们还使用 Yahoo 的 Pure.css 库。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -44,7 +44,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -98,7 +98,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletConfigEx"/>
......@@ -108,7 +108,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -133,28 +133,28 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
这是主页。 它包含一个`HTML`表格。 提交表单后,处理将发送到`MyServlet`
``java
```java
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css">
```
我们包括 Pure.css 库。
``java
```java
<form class="pure-form" action="MyServlet">
```
`form`标记使用 Pure.css 库中的`pure-form`类。 `action`属性指向`MyServlet`
``java
```java
<input type="text" name="name">
```
用户输入的名称值将作为`name`参数发送到 servlet。
``java
```java
<button type="submit" class="pure-button pure-button-primary">Submit</button>
```
......@@ -163,7 +163,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`MyServlet.java`
``java
```java
package com.zetcode.web;
import java.io.IOException;
......@@ -205,7 +205,7 @@ public class MyServlet extends HttpServlet {
`MyServlet`从请求中读取`name`属性并生成输出。 输出为纯文本。
``java
```java
@WebServlet(name = "MyServlet", urlPatterns = {"/MyServlet"}, initParams = {
@WebInitParam(name = "name", value = "Guest")})
......@@ -213,7 +213,7 @@ public class MyServlet extends HttpServlet {
使用`@WebInitParam`,将`name`参数初始化为“来宾”值。
``java
```java
String name = request.getParameter("name");
name = name.trim();
......@@ -221,7 +221,7 @@ name = name.trim();
我们从请求对象和修剪空间读取`name`参数。
``java
```java
if (name.isEmpty()) {
ServletConfig sc = getServletConfig();
......@@ -233,7 +233,7 @@ if (name.isEmpty()) {
如果用户未输入任何值,我们将使用`ServletConfig`读取`name`初始化参数。 使用`getServletConfig()`检索`ServletConfig`。 使用`getInitParameter()`检索参数。
``java
```java
ServletOutputStream os = response.getOutputStream();
os.println("Hello " + name);
......
......@@ -14,7 +14,7 @@ Apache Commons Validator 是用于验证数据的 Java 库。 我们使用此库
在下面的示例中,我们读取带有`InputStream`的网页,并向客户端显示该页面的 HTML 代码。 网页的名称是从 HTML 表单的`input`标签发送的。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -40,7 +40,7 @@ $ tree
这是项目结构。
``java
```java
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
......@@ -64,7 +64,7 @@ $ tree
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletReadWebpage"/>
......@@ -74,7 +74,7 @@ $ tree
`ReadWebPage.java`
``java
```java
package com.zetcode.web;
import com.zetcode.service.WebPageReader;
......@@ -109,28 +109,28 @@ public class ReadWebpage extends HttpServlet {
`ReadWebPage` Servlet 读取给定网页的内容,并将文本发送给客户端。
``java
```java
response.setContentType("text/plain;charset=UTF-8");
```
响应为纯文本,文本编码为 UTF-8。
``java
```java
String page = request.getParameter("webpage");
```
我们使用`getParameter()`从 request 参数获取网页的名称。
``java
```java
String content = new WebPageReader().setWebPageName(page).getWebPageContent();
```
`WebPageReader`用于获取网页的内容。
``java
```java
ServletOutputStream os = response.getOutputStream();
os.write(content.getBytes(StandardCharsets.UTF_8));
......@@ -140,7 +140,7 @@ os.write(content.getBytes(StandardCharsets.UTF_8));
`WebPageReader.java`
``java
```java
package com.zetcode.service;
import java.io.BufferedReader;
......@@ -208,7 +208,7 @@ public class WebPageReader {
`WebPageReader`读取网页的内容。
``java
```java
private boolean validateUrl(String webpage) {
UrlValidator urlValidator = new UrlValidator();
......@@ -220,7 +220,7 @@ private boolean validateUrl(String webpage) {
在阅读网页之前,我们使用 Apache Commons Validator 库中的`UrlValidator`验证 URL。
``java
```java
URL url = new URL(webpage);
try (InputStream is = url.openStream();
......@@ -237,7 +237,7 @@ try (InputStream is = url.openStream();
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -22,7 +22,7 @@ Figure: Project structure
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
......@@ -94,7 +94,7 @@ Maven `pom.xml`包含嵌入式 Tomcat 服务器和用于构建应用的汇编程
`EmbeddedTomcatEx.java`
``java
```java
package com.zetcode.embedded;
import javax.servlet.ServletException;
......@@ -141,7 +141,7 @@ public class EmbeddedTomcatEx {
`EmbeddedTomcatEx`是 Java 控制台应用,其中包括嵌入式 Tomcat 服务器。
``java
```java
Tomcat tomcat = new Tomcat();
tomcat.setPort(8082);
......@@ -149,14 +149,14 @@ tomcat.setPort(8082);
Tomcat 在端口 8082 上启动。默认端口为 8080;默认端口为 8080。 NetBeans 将 8084 用于其内置的 Tomcat 服务器。 我们选择了另一个端口,以免发生冲突。
``java
```java
Context ctx = tomcat.addContext("/", new File(".").getAbsolutePath());
```
每个应用都映射到上下文。 使用`addContext()`方法,我们创建了一个不支持 JSP 文件并且没有`web.xml`文件的应用。 我们使用根上下文路径和当前工作目录作为文档库。
``java
```java
Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
......@@ -173,14 +173,14 @@ Tomcat.addServlet(ctx, "Embedded", new HttpServlet() {
通过`addServlet()`方法添加了一个新的 servlet。 该 servlet 仅以一些 ASCII 文本作为响应。
``java
```java
ctx.addServletMapping("/*", "Embedded");
```
servlet 映射控制如何访问名为 Embedded 的 servlet。 对于我们的示例,所有 URL 最终都会调用我们的 servlet。
``java
```java
tomcat.start();
tomcat.getServer().await();
......@@ -188,7 +188,7 @@ tomcat.getServer().await();
Tomcat 服务器已启动。
``java
```java
$ curl localhost:8082/
Embedded Tomcat servlet.
......@@ -202,7 +202,7 @@ Embedded Tomcat servlet.
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
......@@ -292,7 +292,7 @@ Embedded Tomcat servlet.
`index.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
......@@ -313,7 +313,7 @@ Embedded Tomcat servlet.
`EmbeddedTomcatEx2.java`
``java
```java
package com.zetcode.embedded;
import javax.servlet.ServletException;
......@@ -342,14 +342,14 @@ public class EmbeddedTomcatEx2 {
该应用提供一个 JSP 文件。 该文件位于`src/main/webapp`子目录中。
``java
```java
tomcat.addWebapp("/", new File(docBase).getAbsolutePath());
```
这次我们使用`addWebapp()`将应用添加到 Tomcat 服务器。
``java
```java
$ curl localhost:8082/
<!DOCTYPE html>
......
......@@ -24,7 +24,7 @@ Bootstrap 是 Twitter 的一个 UI 库,用于创建响应式,移动优先的
`countries_mysql.sql`
``java
```java
CREATE TABLE Countries(ID BIGINT NOT NULL PRIMARY KEY AUTO_INCREMENT,
Name VARCHAR(100), Population INT);
......@@ -67,7 +67,7 @@ INSERT INTO Countries(Name, Population) VALUES('Poland', 38439000);
该 SQL 脚本在 MySQL 中创建`Countries`表。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -100,7 +100,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -172,7 +172,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletPagination"/>
......@@ -182,7 +182,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`Country.java`
``java
```java
package com.zetcode.bean;
public class Country {
......@@ -213,7 +213,7 @@ public class Country {
`ReadCountries.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.Country;
......@@ -267,21 +267,21 @@ public class ReadCountries extends HttpServlet {
`ReadCountries` Servlet 确定将从请求属性中检索多少数据,并从数据库表中读取指定的行数。
``java
```java
@WebServlet(name = "ReadCountries", urlPatterns = {"/ReadCountries"})
```
Java 类用`@WebServlet`注释修饰。 它映射到`ReadCountries` URL 模式。
``java
```java
response.setContentType("text/html;charset=UTF-8");
```
Servlet 将以 HTML 输出数据,并且数据的编码设置为 UTF-8。
``java
```java
int currentPage = Integer.valueOf(request.getParameter("currentPage"));
int recordsPerPage = Integer.valueOf(request.getParameter("recordsPerPage"));
......@@ -289,7 +289,7 @@ int recordsPerPage = Integer.valueOf(request.getParameter("recordsPerPage"));
从请求中我们得到两个重要的值:当前页和每页的记录数。
``java
```java
CountryService countryService = new CountryService();
List<Country> countries = countryService.findCountries(currentPage,
......@@ -301,7 +301,7 @@ request.setAttribute("countries", countries);
`CountryService`是用于连接到数据库并读取数据的服务类。 检索国家列表并将其设置为请求的属性。 稍后将由目标 JSP 页面使用。
``java
```java
int rows = countryService.getNumberOfRows();
int nOfPages = rows / recordsPerPage;
......@@ -314,7 +314,7 @@ if (nOfPages % recordsPerPage > 0) {
我们使用`getNumberOfRows()`服务方法从数据库表中获取所有行的数目。 我们计算导航中的页面数。
``java
```java
request.setAttribute("noOfPages", nOfPages);
request.setAttribute("currentPage", currentPage);
request.setAttribute("recordsPerPage", recordsPerPage);
......@@ -323,7 +323,7 @@ request.setAttribute("recordsPerPage", recordsPerPage);
页数,当前页和每页的记录数是我们建立分页所需的值。
``java
```java
RequestDispatcher dispatcher = request.getRequestDispatcher("listCountries.jsp");
dispatcher.forward(request, response);
......@@ -333,7 +333,7 @@ dispatcher.forward(request, response);
`ICountryService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.Country;
......@@ -351,7 +351,7 @@ public interface ICountryService {
`CountryService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.Country;
......@@ -423,14 +423,14 @@ public class CountryService implements ICountryService {
`CountryService`包含两种合同方法的实现。
``java
```java
String sql = "SELECT * FROM Countries LIMIT ?, ?";
```
SQL LIMIT 子句用于获取当前页面的行数。
``java
```java
JdbcTemplate jtm = new JdbcTemplate(ds);
countries = jtm.query(sql, new Object[] {start, recordsPerPage},
new BeanPropertyRowMapper(Country.class));
......@@ -439,7 +439,7 @@ countries = jtm.query(sql, new Object[] {start, recordsPerPage},
`JdbcTemplate`用于执行 SQL 语句。 在`BeanPropertyRowMapper`的帮助下,行自动映射到`Country` bean。
``java
```java
String sql = "SELECT COUNT(Id) FROM Countries";
```
......@@ -448,7 +448,7 @@ String sql = "SELECT COUNT(Id) FROM Countries";
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -492,14 +492,14 @@ String sql = "SELECT COUNT(Id) FROM Countries";
这是主页。 它包含一个 HTML 表单,用于通过`select`标签选择每页的记录数。 该表单使用 Bootstrap 库中的样式类。 提交表单后,处理将发送到`ReadCountries` Servlet。
``java
```java
<input type="hidden" name="currentPage" value="1">
```
该表单包含一个隐藏的`input`标记,该标记将`currentPage`参数设置为 1。
``java
```java
<select class="form-control" id="records" name="recordsPerPage">
<option value="5">5</option>
<option value="10" selected>10</option>
......@@ -510,7 +510,7 @@ String sql = "SELECT COUNT(Id) FROM Countries";
`select`标签允许每页选择 5、10 或 15 条记录。
``java
```java
<button type="submit" class="btn btn-primary">Submit</button>
```
......@@ -519,7 +519,7 @@ String sql = "SELECT COUNT(Id) FROM Countries";
`listCountries.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -590,14 +590,14 @@ String sql = "SELECT COUNT(Id) FROM Countries";
`listCountries.jsp`在表格和分页系统中显示数据。 Bootstrap 用于使 UI 响应并看起来不错。
``java
```java
<table class="table table-striped table-bordered table-sm">
```
`table``table-striped``table-bordered``table-sm`都是 Bootstrap 类。
``java
```java
<c:forEach items="${countries}" var="country">
<tr>
<td>${country.getName()}</td>
......@@ -609,7 +609,7 @@ String sql = "SELECT COUNT(Id) FROM Countries";
使用 JSTL 的`forEach`标签,我们可以显示当前页面的所有数据。
``java
```java
<c:if test="${currentPage != 1}">
<li class="page-item"><a class="page-link"
href="ReadCountries?recordsPerPage=${recordsPerPage}&currentPage=${currentPage-1}">Previous</a>
......@@ -620,7 +620,7 @@ String sql = "SELECT COUNT(Id) FROM Countries";
使用`c:if`标签,我们仅在存在前一个链接时显示它。 在链接中,我们将`recordsPerPage``currentPage`值传递给请求对象。
``java
```java
<c:forEach begin="1" end="${noOfPages}" var="i">
<c:choose>
<c:when test="${currentPage eq i}">
......
......@@ -22,7 +22,7 @@ Weld 是 Java EE 平台的 CDI 的参考实现。 Weld 已集成到许多 Java E
在以下 Web 应用中,我们创建一个 servlet,该 servlet 返回 HTML 文件中的城市对象列表。 在应用中,我们在 Weld 库的帮助下使用依赖项注入。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -58,7 +58,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -126,7 +126,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletWeld">
......@@ -143,7 +143,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`City.java`
``java
```java
package com.zetcode.bean;
import java.util.Objects;
......@@ -221,7 +221,7 @@ public class City {
`beans.xml`
``java
```java
<?xml version="1.0"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -237,7 +237,7 @@ http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
`ICityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -254,7 +254,7 @@ public interface ICityService {
`CityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -280,7 +280,7 @@ public class CityService implements ICityService {
`CityService`包含`ICityService`接口的实现。 服务类调用 DAO 对象的方法,该方法是数据库的中间层。
``java
```java
@ManagedBean
public class CityService implements ICityService {
......@@ -288,7 +288,7 @@ public class CityService implements ICityService {
`@ManagedBean`是一个可选注释,指示`CityService`将由 Weld 管理。
``java
```java
@Inject
private ICityDao cityDao;
......@@ -298,7 +298,7 @@ private ICityDao cityDao;
`ICityDao.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.bean.City;
......@@ -315,7 +315,7 @@ public interface ICityDao {
`CityDao.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.bean.City;
......@@ -348,7 +348,7 @@ public class CityDao implements ICityDao {
`CityDao`包含`findAll()` DAO 方法的实现。 为简单起见,我们不连接数据库,而只是返回`City`对象的列表。
``java
```java
@ManagedBean
public class CityDao implements ICityDao {
......@@ -358,7 +358,7 @@ public class CityDao implements ICityDao {
`GetCities.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.City;
......@@ -397,14 +397,14 @@ public class GetCities extends HttpServlet {
`GetCities` servlet 调用城市服务的`getCities()`方法和响应与包含在 HTML 表中的所有城市中的 HTML 页面。
``java
```java
@WebServlet(name = "GetCities", urlPatterns = {"/GetCities"})
```
Java 类用`@WebServlet`注释修饰。 它映射到`GetCities` URL 模式。
``java
```java
@Inject
ICityService cityService;
......@@ -412,14 +412,14 @@ ICityService cityService;
使用`@Inject`注解,将`CityService`注入`CityService`属性。
``java
```java
response.setContentType("application/html;charset=UTF-8");
```
Servlet 将以 HTML 输出数据,并且数据的编码设置为 UTF-8。
``java
```java
List<City> cities = cityService.getCities();
request.setAttribute("cities", cities);
......@@ -427,14 +427,14 @@ request.setAttribute("cities", cities);
使用`CityService's` `getCities()`检索所有城市。
``java
```java
request.setAttribute("cities", cities);
```
我们将列表设置为请求。
``java
```java
RequestDispatcher dispatcher = request.getRequestDispatcher("listCities.jsp");
dispatcher.forward(request, response);
......@@ -444,7 +444,7 @@ dispatcher.forward(request, response);
`listCities.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -484,7 +484,7 @@ dispatcher.forward(request, response);
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -30,7 +30,7 @@ POST 请求有三种编码 HTML 表单方法:
`/var/www`目录是 Debian Linux 中 Web 内容的标准目录。
``java
```java
$ ls -ld /var/www/upload/
drwxrwxr-x 2 www-data www-data 4096 Dec 3 14:29 /var/www/upload/
......@@ -42,7 +42,7 @@ drwxrwxr-x 2 www-data www-data 4096 Dec 3 14:29 /var/www/upload/
这是一个 Maven Web 应用。 它部署在 Tomcat 上。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -64,7 +64,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -117,7 +117,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletFileUploadEx"/>
......@@ -127,7 +127,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`FileUploadServlet.java`
``java
```java
package com.zetcode;
import java.io.IOException;
......@@ -178,7 +178,7 @@ public class FileUploadServlet extends HttpServlet {
`FileUploadServlet`将文件上传到`/var/www/upload`目录。
``java
```java
@WebServlet(name = "FileUploadServlet", urlPatterns = {"/FileUploadServlet"},
initParams = { @WebInitParam(name = "uploadpath", value = "/var/www/upload/") })
......@@ -186,14 +186,14 @@ public class FileUploadServlet extends HttpServlet {
使用`@WebServlet`批注,我们将 servlet 映射到`/FileUploadServlet` URL 模式,并定义了初始的`uploadpath`变量。
``java
```java
@MultipartConfig
```
servlet 也用`@MultipartConfig`装饰。 `@MultipartConfig`批注指示 servlet 期望使用`multipart/form-data` MIME 类型进行请求。
``java
```java
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
......@@ -202,14 +202,14 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
POST 请求由`doPost()`方法处理。
``java
```java
ServletOutputStream os = response.getOutputStream();
```
我们使用`getOutputStream()`方法获得 servlet 输出流。
``java
```java
ServletConfig sc = getServletConfig();
String path = sc.getInitParameter("uploadpath");
......@@ -217,14 +217,14 @@ String path = sc.getInitParameter("uploadpath");
我们检索初始参数。 这是我们要上传文件的目录。
``java
```java
Part filePart = request.getPart("myfile");
```
使用`getPart()`方法检索文件部分。
``java
```java
String fileName = filePart.getSubmittedFileName();
InputStream is = filePart.getInputStream();
......@@ -232,7 +232,7 @@ InputStream is = filePart.getInputStream();
我们得到零件的文件名和输入流。
``java
```java
Files.copy(is, Paths.get(path + fileName),
StandardCopyOption.REPLACE_EXISTING);
......@@ -240,7 +240,7 @@ Files.copy(is, Paths.get(path + fileName),
使用`Files.copy()`,将文件复制到目标目录。
``java
```java
os.print("File successfully uploaded");
```
......@@ -249,7 +249,7 @@ os.print("File successfully uploaded");
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -274,14 +274,14 @@ os.print("File successfully uploaded");
这是选择要上传文件的主页。 它包含一个 HTML 表单。 提交表单后,处理将发送到`FileUploadServlet`
``java
```java
<link rel="stylesheet" href="https://unpkg.com/purecss@1.0.0/build/pure-min.css">
```
我们包括 Pure.css 库,用于创建负责任的页面。
``java
```java
<form class="pure-form pure-form-stacked" method="post" action="FileUploadServlet"
enctype="multipart/form-data">
......@@ -289,14 +289,14 @@ os.print("File successfully uploaded");
`method`属性为 post,因为我们将数据发送到服务器。 `action`属性指定处理请求的 servlet 的名称。 `enctype`属性指定`multipart/form-data`编码类型,这是使用 HTML 格式上传文件所必需的。
``java
```java
<input type="file" name="myfile">
```
`input`标签的`type`属性使用户可以选择一个文件。
``java
```java
<button type="submit" class="pure-button pure-button-primary">Upload</button>
```
......
......@@ -24,7 +24,7 @@ Servlet 是 Java 类,可响应特定类型的网络请求-最常见的是 HTTP
`cars_mysql.sql`
``java
```java
-- SQL for the Cars table
CREATE TABLE Cars(Id BIGINT PRIMARY KEY AUTO_INCREMENT, Name VARCHAR(150),
......@@ -42,7 +42,7 @@ INSERT INTO Cars(Name, Price) VALUES('Volkswagen', 21600);
该 SQL 脚本在 MySQL 中创建`Cars`表。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -83,7 +83,7 @@ $ tree
`pom.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -151,7 +151,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletServeXml">
......@@ -173,7 +173,7 @@ http://maven.apache.org/xsd/maven-4.0.0.xsd">
`Car.java`
``java
```java
package com.zetcode.model;
import java.util.Objects;
......@@ -247,7 +247,7 @@ public class Car {
`Car` bean 从`Cars`数据库表中保留一行。
``java
```java
@XmlRootElement(name = "car")
@XmlType(propOrder = {"id", "name", "price"})
......@@ -257,7 +257,7 @@ public class Car {
`CarList.java`
``java
```java
package com.zetcode.model;
import java.util.List;
......@@ -288,14 +288,14 @@ public class CarList {
`CarList`是一个帮助器类,其中包含 JAXB 映射注释,以在 XML 输出中的汽车标签周围创建包装器。
``java
```java
@XmlElementWrapper(name = "cars")
```
`@XmlElementWrapper`注释在列表中的元素周围创建了一个包装。
``java
```java
@XmlElement(name = "car")
```
......@@ -304,7 +304,7 @@ public class CarList {
`ServiceLocator.java`
``java
```java
package com.zetcode.util;
import java.util.logging.Level;
......@@ -339,7 +339,7 @@ public class ServiceLocator {
`ICarsService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.model.Car;
......@@ -357,7 +357,7 @@ public interface ICarsService {
`CarsService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.dao.CarsDAO;
......@@ -400,7 +400,7 @@ public class CarsService implements ICarsService {
`ICarsDAO.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.model.Car;
......@@ -418,7 +418,7 @@ public interface ICarsDAO {
`CarsDAO.java`
``java
```java
package com.zetcode.dao;
import com.zetcode.model.Car;
......@@ -490,7 +490,7 @@ public class CarsDAO implements ICarsDAO {
`CarsDAO`包含 DAO 方法的实现。 我们使用 Spring 的 JdbcTemplate 模块访问数据库。
``java
```java
private JdbcTemplate createJdbcTemplate() {
DataSource ds = ServiceLocator.getDataSource("java:comp/env/jdbc/testdb");
......@@ -504,7 +504,7 @@ private JdbcTemplate createJdbcTemplate() {
`CarsXmlConverter.java`
``java
```java
package com.zetcode.converter;
import com.zetcode.model.Car;
......@@ -564,14 +564,14 @@ public class CarsXmlConverter {
`CarsXmlConverter`包含将 Java 类转换为 XML 数据的方法。
``java
```java
public ByteArrayOutputStream convertList(List<Car> cars) {
```
该方法返回`ByteArrayOutputStream`
``java
```java
JAXBContext context = JAXBContext.newInstance(CarList.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
......@@ -580,7 +580,7 @@ m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
创建了 JAXB 编组器。
``java
```java
CarList carsList = new CarList();
carsList.setCars(cars);
......@@ -592,7 +592,7 @@ m.marshal(carsList, bos);
`GetCars.java`
``java
```java
package com.zetcode.web;
import com.zetcode.converter.CarsXmlConverter;
......@@ -633,21 +633,21 @@ public class GetCars extends HttpServlet {
`GetCars` Servlet 将`Cars`表中的所有数据作为 XML 数据返回。
``java
```java
@WebServlet(name = "GetCars", urlPatterns = {"/GetCars"})
```
Java 类用`@WebServlet`注释修饰。 它映射到`GetCars` URL 模式。
``java
```java
response.setContentType("application/xml;charset=UTF-8");
```
Servlet 将以 XML 输出数据,并且数据的编码设置为 UTF-8。
``java
```java
CarsService carsService = new CarsService();
List<Car> cars = carsService.findAllCars();
......@@ -655,7 +655,7 @@ List<Car> cars = carsService.findAllCars();
使用`CarsService's` `findAllCars()`,我们从数据库中检索所有汽车。
``java
```java
CarsXmlConverter xmlConverter = new CarsXmlConverter();
try (ByteArrayOutputStream bos = xmlConverter.convertList(cars)) {
......@@ -669,7 +669,7 @@ try (ByteArrayOutputStream bos = xmlConverter.convertList(cars)) {
`GetCar.java`
``java
```java
package com.zetcode.web;
import com.zetcode.converter.CarsXmlConverter;
......@@ -714,7 +714,7 @@ public class GetCar extends HttpServlet {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -10,7 +10,7 @@ Servlet 是响应网络请求的 Java 类。 这主要是一个 HTTP 请求。 J
`javax.servlet``javax.servlet.http`包提供用于编写​​servlet 的接口和类。
``java
```java
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
......@@ -26,7 +26,7 @@ Servlet 是响应网络请求的 Java 类。 这主要是一个 HTTP 请求。 J
在下面的示例中,我们使用`@WebServlet`批注创建 Java Servlet。 从 Servlet 3.0 规范开始可以使用`@WebServlet`批注。 注解在部署时由容器处理。
``java
```java
$ tree
.
├── nb-configuration.xml
......@@ -53,7 +53,7 @@ $ tree
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletAnnotation"/>
......@@ -63,7 +63,7 @@ $ tree
`MyServlet.java`
``java
```java
package com.zetcode.web;
import java.io.IOException;
......@@ -93,14 +93,14 @@ public class MyServlet extends HttpServlet {
`MyServlet` Servlet 将一条简单的文本消息返回给客户端。
``java
```java
@WebServlet(name = "MyServlet", urlPatterns = {"/MyServlet"})
```
Java 类用`@WebServlet`注解修饰。 它映射到`MyServlet` URL 模式。
``java
```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
......@@ -109,21 +109,21 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
GET 请求调用`doGet()`方法。 该方法接收`HttpServletRequest``HttpServletResponse`对象。
``java
```java
response.setContentType("text/html;charset=UTF-8");
```
Servlet 将以纯文本格式输出数据,并且数据的编码设置为 UTF-8。
``java
```java
ServletOutputStream out = response.getOutputStream();
```
通过`getOutputStream()`方法,我们获得了 servlet 输出流。
``java
```java
out.print("This is MyServlet");
```
......@@ -132,7 +132,7 @@ out.print("This is MyServlet");
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -152,7 +152,7 @@ out.print("This is MyServlet");
在第二个示例中,我们在`web.xml`部署描述符中定义了两个 servlet。 在 Servlet 3.0 规范之前,这是定义 Java Servlet 的唯一方法。
``java
```java
$ tree
.
├── pom.xml
......@@ -179,7 +179,7 @@ $ tree
`context.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/JavaServletXML"/>
......@@ -189,7 +189,7 @@ $ tree
`web.xml`
``java
```java
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
......@@ -228,7 +228,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`web.xml`文件中,我们定义了两个 Servlet:`FirstServlet``SecondServlet``web.xml`位于`WEB-INF`目录中。
``java
```java
<servlet>
<servlet-name>FirstServlet</servlet-name>
<servlet-class>com.zetcode.web.FirstServlet</servlet-class>
......@@ -238,7 +238,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
我们定义名称和 servlet 类。
``java
```java
<servlet-mapping>
<servlet-name>FirstServlet</servlet-name>
<url-pattern>/FirstServlet</url-pattern>
......@@ -250,7 +250,7 @@ http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd">
`FirstServlet.java`
``java
```java
package com.zetcode.web;
import java.io.IOException;
......@@ -280,7 +280,7 @@ public class FirstServlet extends HttpServlet {
`SecondServlet.java`
``java
```java
package com.zetcode.web;
import java.io.IOException;
......@@ -310,7 +310,7 @@ public class SecondServlet extends HttpServlet {
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......
......@@ -24,7 +24,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
`<c:foreach>`标记属于核心 JSTL 标记。
``java
```java
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
```
......@@ -35,7 +35,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
要使用 JSTL 库,我们需要以下 Maven 依赖项:
``java
```java
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
......@@ -50,7 +50,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
`index.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -76,7 +76,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -96,7 +96,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
`target.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -118,7 +118,7 @@ JSTL `<c:foreach>`标签是基本的迭代标签。 它遍历各种 Java 集合
JSP 页面在隐式`param`对象(它是一个映射)中接收参数。
``java
```java
<c:forEach var="par" items="${param}">
<c:out value="${par.key}"/>: <c:out value="${par.value}"/> <br>
......@@ -135,7 +135,7 @@ HTML `&lt;select&gt;`是提供选项菜单的控件。 借助其`multiple`属性
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -170,7 +170,7 @@ HTML `&lt;select&gt;`是提供选项菜单的控件。 借助其`multiple`属性
`target.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -190,7 +190,7 @@ HTML `&lt;select&gt;`是提供选项菜单的控件。 借助其`multiple`属性
可从隐式`paramValues`对象(它是一个映射)获得`&lt;select&gt;`控件的值。 关键是请求参数名称(`languages`),值在字符串数组中。
``java
```java
<c:forEach items="${paramValues.languages}" var="lang">
<c:out value="${lang}"/>
</c:forEach>
......@@ -205,7 +205,7 @@ HTML `&lt;select&gt;`是提供选项菜单的控件。 借助其`multiple`属性
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -225,7 +225,7 @@ HTML `&lt;select&gt;`是提供选项菜单的控件。 借助其`multiple`属性
`City.java`
``java
```java
package com.zetcode.bean;
public class City {
......@@ -271,7 +271,7 @@ public class City {
`MyServlet.java`
``java
```java
package com.zetcode.web;
import com.zetcode.bean.City;
......@@ -307,7 +307,7 @@ Servlet 使用`CityService.getAllCities()`读取数据,使用`setAttribute()`
`CityService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.bean.City;
......@@ -339,7 +339,7 @@ public class CityService {
`showCities.jsp`
``java
```java
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
......@@ -377,7 +377,7 @@ public class CityService {
`showCities.jsp`中,我们在带有`&lt;c:forEach&gt;`标签的 HTML 表格中显示城市。
``java
```java
<td>${city.id}</td>
<td>${city.name}</td>
<td>${city.population}</td>
......
......@@ -23,7 +23,7 @@ JSON(JavaScript 对象表示法)是一种轻量级的数据交换格式。
`cars.sql`
``java
```java
CREATE TABLE CARS(ID INTEGER NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1), NAME VARCHAR(30), PRICE INT);
......@@ -40,7 +40,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
在示例中,我们使用`CARS`数据库表,该表位于 Derby `testdb`数据库中。
``java
```java
<dependencies>
<dependency>
<groupId>javax</groupId>
......@@ -81,7 +81,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
`index.html`
``java
```java
<!DOCTYPE html>
<html>
<head>
......@@ -106,7 +106,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
`index.html`文件中,我们包含`jQuery``jsGrid`库。
``java
```java
<div id="jsGrid"></div>
```
......@@ -115,7 +115,7 @@ INSERT INTO CARS(NAME, PRICE) VALUES('Volkswagen', 21600);
`style.css`
``java
```java
html {
height: 100%;
}
......@@ -131,7 +131,7 @@ body {
`sample.js`
``java
```java
$(function () {
$.ajax({
......@@ -192,7 +192,7 @@ $(function () {
`sample.js`文件中,我们创建并配置`jsGrid`组件。
``java
```java
inserting: true,
editing: true,
sorting: true,
......@@ -202,7 +202,7 @@ paging: true,
我们的`jsGrid`组件可以插入,编辑和排序数据,还支持分页。
``java
```java
loadData: function (filter) {
return $.ajax({
type: "GET",
......@@ -215,7 +215,7 @@ loadData: function (filter) {
`loadData()`函数在`ManageCars` Servlet 上发出 HTTP GET 方法。
``java
```java
insertItem: function (item) {
return $.ajax({
type: "POST",
......@@ -228,7 +228,7 @@ insertItem: function (item) {
当我们插入新项目时,将在`ManageCars` Servlet 上发出 HTTP POST 方法。
``java
```java
updateItem: function (item) {
return $.ajax({
type: "PUT",
......@@ -241,7 +241,7 @@ updateItem: function (item) {
更新项目会在`ManageCars` Servlet 上生成 HTTP PUT 方法。
``java
```java
deleteItem: function (item) {
return $.ajax({
type: "DELETE",
......@@ -254,7 +254,7 @@ deleteItem: function (item) {
删除项目会在`ManageCars` Servlet 上生成 HTTP DELETE 方法。
``java
```java
fields: [
{name: "NAME", title: "Name", type: "text", width: 60},
{name: "PRICE", title: "Price", type: "text", width: 50},
......@@ -267,7 +267,7 @@ fields: [
`ManageCars.java`
``java
```java
package com.zetcode.web;
import com.zetcode.service.CarService;
......@@ -340,7 +340,7 @@ public class ManageCars extends HttpServlet {
`ManageCars`是 Java Servlet,其中包含 HTTP GET,POST,PUT 和 DELETE 方法的相应方法。
``java
```java
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
......@@ -357,7 +357,7 @@ protected void doGet(HttpServletRequest request, HttpServletResponse response)
响应于 HTTP GET 方法,调用`doGet()`方法。 它调用`CarService's` `getCarsJSON()`方法,该方法从 CARS 表中返回所有汽车。 数据以 JSON 格式发送回客户端。
``java
```java
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
......@@ -374,7 +374,7 @@ protected void doPost(HttpServletRequest request, HttpServletResponse response)
`doPost()`方法中,我们从请求中检索 NAME 和 PRICE 参数,然后使用`CarService.insertCar()`方法将它们插入数据库中。 当我们收到一个 HTTP POST 方法时,`doPost()`方法被调用,期望添加新的资源。
``java
```java
@Override
protected void doPut(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
......@@ -393,7 +393,7 @@ protected void doPut(HttpServletRequest request, HttpServletResponse response)
`doPut()`方法中,我们从请求中检索 NAME 和 PRICE 参数,然后使用`CarService.updateCar()`方法将它们插入数据库中。 当我们接收到 HTTP PUT 方法时,会期望`doPut()`方法被调用,期望对资源进行修改。
``java
```java
@Override
protected void doDelete(HttpServletRequest request, HttpServletResponse response)
throws ServletException {
......@@ -413,7 +413,7 @@ protected void doDelete(HttpServletRequest request, HttpServletResponse response
`CarService.java`
``java
```java
package com.zetcode.service;
import com.zetcode.util.Utils;
......@@ -585,7 +585,7 @@ public class CarService {
`CarService`包含用于数据检索和修改的方法。 我们使用标准的 JDBC 代码。 Java 数据库连接(JDBC)是 Java 编程语言的应用编程接口(API),它定义了客户端如何访问数据库。
``java
```java
DataSource ds = Utils.getDataSource();
con = ds.getConnection();
pst = con.prepareStatement("DELETE FROM CARS WHERE Name=?");
......@@ -596,7 +596,7 @@ pst.executeUpdate();
在这里,我们创建数据源并建立与 Derby 数据库的新连接。 我们执行 DELETE SQL 语句。
``java
```java
DataSource ds = Utils.getDataSource();
con = ds.getConnection();
pst = con.prepareStatement("INSERT INTO CARS(NAME, PRICE) "
......@@ -609,7 +609,7 @@ pst.executeUpdate();
这是用于插入新车的 JDBC 代码。
``java
```java
DataSource ds = Utils.getDataSource();
con = ds.getConnection();
pst = con.prepareStatement("SELECT NAME, PRICE FROM Cars");
......@@ -623,7 +623,7 @@ jarray = SimpleJsonUtils.toJSON(rs);
`Utils.java`
``java
```java
package com.zetcode.util;
import com.google.common.base.Splitter;
......@@ -695,7 +695,7 @@ public class Utils {
`Utils`是一个帮助程序类,它包含两个方法:`getDataSource()``getParameterMap()`
``java
```java
public static DataSource getDataSource() {
ClientDataSource ds = new ClientDataSource();
......@@ -713,7 +713,7 @@ public static DataSource getDataSource() {
`getDataSource()`创建并返回一个 Derby 数据源。
``java
```java
InputStreamReader reader = new InputStreamReader(
request.getInputStream());
br = new BufferedReader(reader);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册