Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
zetcode-zh
提交
f571d241
Z
zetcode-zh
项目概览
OpenDocCN
/
zetcode-zh
9 个月 前同步成功
通知
2
Star
157
Fork
40
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Z
zetcode-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f571d241
编写于
11月 11, 2019
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2019-11-11 19:09:14
上级
766896c7
变更
25
隐藏空白更改
内联
并排
Showing
25 changed file
with
424 addition
and
424 deletion
+424
-424
docs/servlet/10.md
docs/servlet/10.md
+14
-14
docs/servlet/11.md
docs/servlet/11.md
+18
-18
docs/servlet/12.md
docs/servlet/12.md
+8
-8
docs/servlet/13.md
docs/servlet/13.md
+19
-19
docs/servlet/14.md
docs/servlet/14.md
+13
-13
docs/servlet/15.md
docs/servlet/15.md
+16
-16
docs/servlet/16.md
docs/servlet/16.md
+32
-32
docs/servlet/17.md
docs/servlet/17.md
+17
-17
docs/servlet/18.md
docs/servlet/18.md
+21
-21
docs/servlet/19.md
docs/servlet/19.md
+17
-17
docs/servlet/2.md
docs/servlet/2.md
+7
-7
docs/servlet/20.md
docs/servlet/20.md
+10
-10
docs/servlet/21.md
docs/servlet/21.md
+14
-14
docs/servlet/22.md
docs/servlet/22.md
+17
-17
docs/servlet/23.md
docs/servlet/23.md
+13
-13
docs/servlet/24.md
docs/servlet/24.md
+13
-13
docs/servlet/25.md
docs/servlet/25.md
+12
-12
docs/servlet/26.md
docs/servlet/26.md
+13
-13
docs/servlet/3.md
docs/servlet/3.md
+27
-27
docs/servlet/4.md
docs/servlet/4.md
+21
-21
docs/servlet/5.md
docs/servlet/5.md
+19
-19
docs/servlet/6.md
docs/servlet/6.md
+26
-26
docs/servlet/7.md
docs/servlet/7.md
+18
-18
docs/servlet/8.md
docs/servlet/8.md
+15
-15
docs/servlet/9.md
docs/servlet/9.md
+24
-24
未找到文件。
docs/servlet/10.md
浏览文件 @
f571d241
...
...
@@ -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
...
...
docs/servlet/11.md
浏览文件 @
f571d241
...
...
@@ -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
();
...
...
docs/servlet/12.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/13.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/14.md
浏览文件 @
f571d241
...
...
@@ -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
```
...
...
docs/servlet/15.md
浏览文件 @
f571d241
...
...
@@ -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
)
{
...
...
docs/servlet/16.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/17.md
浏览文件 @
f571d241
...
...
@@ -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
)
{
...
...
docs/servlet/18.md
浏览文件 @
f571d241
...
...
@@ -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
;
```
...
...
docs/servlet/19.md
浏览文件 @
f571d241
...
...
@@ -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"
>
```
使用
`<c:forEach>`
标签,我们遍历
`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
>
...
...
docs/servlet/2.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/20.md
浏览文件 @
f571d241
...
...
@@ -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
);
```
...
...
docs/servlet/21.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/22.md
浏览文件 @
f571d241
...
...
@@ -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
]
%-
5
p
%
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
...
...
docs/servlet/23.md
浏览文件 @
f571d241
...
...
@@ -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
```
...
...
docs/servlet/24.md
浏览文件 @
f571d241
...
...
@@ -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
);
...
...
docs/servlet/25.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/26.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/3.md
浏览文件 @
f571d241
...
...
@@ -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}"
>
...
...
docs/servlet/4.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/5.md
浏览文件 @
f571d241
...
...
@@ -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
>
```
...
...
docs/servlet/6.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/7.md
浏览文件 @
f571d241
...
...
@@ -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
>
...
...
docs/servlet/8.md
浏览文件 @
f571d241
...
...
@@ -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 `<select>`是提供选项菜单的控件。 借助其`multiple`属性
`index.html`
``
java
``
`
java
<!
DOCTYPE
html
>
<
html
>
<
head
>
...
...
@@ -170,7 +170,7 @@ HTML `<select>`是提供选项菜单的控件。 借助其`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 `<select>`是提供选项菜单的控件。 借助其`multiple`属性
可从隐式
`paramValues`
对象(它是一个映射)获得
`<select>`
控件的值。 关键是请求参数名称(
`languages`
),值在字符串数组中。
``java
``
`
java
<
c:
forEach
items
=
"${paramValues.languages}"
var
=
"lang"
>
<
c:
out
value
=
"${lang}"
/>
</
c:
forEach
>
...
...
@@ -205,7 +205,7 @@ HTML `<select>`是提供选项菜单的控件。 借助其`multiple`属性
`index.html`
``java
``
`
java
<!
DOCTYPE
html
>
<
html
>
<
head
>
...
...
@@ -225,7 +225,7 @@ HTML `<select>`是提供选项菜单的控件。 借助其`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`
中,我们在带有
`<c:forEach>`
标签的 HTML 表格中显示城市。
``
java
``
`
java
<
td
>
$
{
city
.
id
}</
td
>
<
td
>
$
{
city
.
name
}</
td
>
<
td
>
$
{
city
.
population
}</
td
>
...
...
docs/servlet/9.md
浏览文件 @
f571d241
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录