JSP注释

JSP页面中共有三种注释

  • HTML注释<!--html注释-->,HTML注释在客户端(浏览器)是可以看到的。
  • JSP注释<%--JSP注释--%>,JSP注释在客户端不可见。注意了不要和html注释混淆<%!--JSP注释--%>这样写是不对的。
  • JSP脚本注释(Java注释),JSP脚本中写的是Java代码,用到的注释也就是Java的注释,有:
    • 单行注释://,
    • 多行注释:/**/,
    • 文档注释/** */
    • JSP脚本注释同样在客户端不可见。
  • 动态注释:,在html注释中写入jsp表达式,由于HIML注释对JSP嵌入的代码不起作用,因此可以利用它们的组合构成动态的HTML注释文本,例如:
    1
    <!-- <%= new Date0)%> -->

    实例

    在index.jsp写输入下面的注释:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
    <%-- <%@ page language="java" import="java.util.*" contentType="text/html; charset=ISO-8859-1" %> --%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>HelloWorld</title>
    </head>
    <body>
    <h2>Hello 这是我的第一个JavaWeb项目</h2>
    <!-- 我是HTML注释 客户端可见 -->
    <%-- 我是JSP注释 客户端不可见--%>
    <%
    //单行注释 客户端不可见
    /*
    多行注释 客户端不可见
    */
    %>
    </body>
    </html>
    然后打开浏览器查看index.jsp源码:

    可以发现我们可以看到HTML注释,但是是看不到JSP注释和JSP脚本注释的.

英文

单词 读音
annotation

JSP页面生命周期

JSP生命周期就是从创建到销毁的整个过程

  • 编译阶段
    • servlet容器编译servlet源文件,生成servlet类
  • 初始化阶段
    • 加载与JSP对应的servlet类,创建其实例,并调用它的初始化方法
  • 执行阶段
    • 调用与JSP对应的servlet实例的服务方法
  • 销毁阶段
    • 调用与JSP对应的servlet实例的销毁方法,然后销毁servlet实例

JSP编译

当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。
编译的过程包括三个步骤:

  • 解析JSP文件。
  • 将JSP文件转为servlet。
  • 编译servlet。

JSP初始化

容器载入JSP文件后,它会在为请求提供任何服务前调用jspInit()方法。如果您需要执行自定义的JSP初始化任务,复写jspInit()方法就行了,就像下面这样:

1
2
3
public void jspInit(){
// 初始化代码
}

一般来讲程序只初始化一次,通常情况下您可以在jspInit()方法中初始化数据库连接、打开文件和创建查询表。

JSP执行

这一阶段描述了JSP生命周期中一切与请求相关的交互行为,直到被销毁。
当JSP网页完成初始化后,JSP引擎将会调用_jspService()方法。

_jspService()方法需要一个HttpServletRequest对象和一个HttpServletResponse对象作为它的参数,就像下面这样:

1
2
3
4
5
void _jspService(HttpServletRequest request,
HttpServletResponse response)
{
// 服务端处理代码
}

_jspService()方法在每个request中被调用一次,并且负责产生与之相对应的response,并且它还负责产生所有7个HTTP方法的回应,比如GET、POST、DELETE等等。

_jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步问题,由于该 Servlet始终驻于内存,所以响应是非常快的。

JSP清理

JSP生命周期的销毁阶段描述了当一个JSP网页从容器中被移除时所发生的一切

jspDestroy()方法在JSP中等价于servlet中的销毁方法。当您需要执行任何清理工作时复写jspDestroy()方法,比如释放数据库连接或者关闭文件夹等等。

jspDestroy()方法的格式如下:

1
2
3
4
public void jspDestroy()
{
// 清理代码
}

实例

参考链接

http://www.runoob.com/jsp/jsp-life-cycle.html
https://www.cnblogs.com/x_wukong/p/3646848.html

问题描述

今天eclipse for JavaEE中配置Tomcat时遇到下面问题:

1
The Apache Tomcat installation at this directory is version 8.5.35.  A Tomcat 8.0 installation is expected.

这是因为我的Eclipse版本比较老,只支持到tomcat8.0,还不支持tomcat8.5

解决方案

方案1 下载最新版的eclipse for JavaEE

推荐使用这种方式。截止目前2018/12/12最新版的eclipse for JavaEE已经支持到tomcat v9.0了,直接下载最新版的就行了。

[下载eclipse for JavaEE](下载eclipse for JavaEE)

方案 2 修改Apache源代码中的配置文件

参见:https://jingyan.baidu.com/article/48a42057f8dfafa92525044d.html

步骤

手工创建java web程序步骤如下:

  • 创建项目目录结构
    • 在 WebApps创建项目目录,我这里是D:\dev\apache-tomcat-8.0.33\webapps
    • 编写 index. jsp
    • 创建WEB-INF目录
      • 创建web.xml文件
        • 编写web.xml文件
      • 创建classes目录
      • 创建lib目录
  • 测试运行

创建项目目录结构

创建项目目录

在webapps目录下创建一个HelloWorld目录(项目),如下所示:

创建index.jsp

然后进入HelloWorld目录,创建一个index.jsp文件,如下图所示:

然后打开index.jsp文件,在里面写上基本html代码,如下所示:

1
2
3
4
5
6
7
8
9
<html>
<head>
<meta charset="utf-8">
<title>HelloWorld</title>
</head>
<body>
<h1>欢迎来到HelloWorld</h1>
</body>
</html>

创建Web_INF文件夹

这个文件夹,可以参考tomcat自带的样例项目:

在HellowWorld文件夹下,创建WEB-INF目录,如下所示:

创建web.xml文件

然后进入WEB-INF目录,创建一个web.xml文件,如下所示:

编写web.xml文件

web.xml里面的东西该写什么,现在还不知道,可以复制样例项目中的web.xml文件粘贴到HelloWorld中的web.xml,然后删除掉注释和其他标签,只保留跟标签即可。如下所示:

1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1"
metadata-complete="true">


</web-app>

创建classes目录

接着在WEB-INF目录下,创建classes目录,如下图所示:

classes目录用于存放编译生成的.class文件

创建lib目录

接着在WEB-INF目录下,创建lib目录,如下图所示:

lib目录用于存放项目中用到的.jar包。
到这里整个项目的目录结构就创建好了,完整目录结果如下所示:

启动tomcat服务器

进入tomcat安装目录下的bin目录,点击startup.bat启动tomcat服务器。

然后点击浏览器,输入地址http://localhost:8080/HelloWorld/index.jsp就可以打开网页了:

浏览器查看

可以看到这里中文是乱码的,该一下浏览器的编码即可:

这样就显示正常了:

参考链接

慕课视频: https://www.imooc.com/video/2926

regexper在线地址

regexper可以将正则表达式转成直观的图形
https://regexper.com/

regexper本地安装

regexper在github上地址为:https://github.com/javallone/regexper-static

安装yarn

安装regexper的依赖和启动本地服务器需要使用yarn,所以要安装yarn。打开git-bash,输入npm install -g yarn安装yarn,如下所示:

1
2
3
4
5
6
7
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub
$ npm install -g yarn
F:\Program Files\nodejs\node_global\yarn -> F:\Program Files\nodejs\node_global\node_modules\yarn\bin\yarn.js
F:\Program Files\nodejs\node_global\yarnpkg -> F:\Program Files\nodejs\node_global\node_modules\yarn\bin\yarn.js
+ yarn@1.12.3
added 1 package in 3.03s

clone到本地

cd进入到一个目录,然后输入 git clone git@github.com:javallone/regexper-static.git把项目复制到当前目录下。

1
2
3
4
5
6
7
8
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub
$ git clone git@github.com:javallone/regexper-static.git
Cloning into 'regexper-static'...
remote: Enumerating objects: 5036, done.
remote: Total 5036 (delta 0), reused 0 (delta 0), pack-reused 5036
Receiving objects: 100% (5036/5036), 1.02 MiB | 903.00 KiB/s, done.
Resolving deltas: 100% (3196/3196), done.

cd进入项目

1
2
3
4
5
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub
$ ls
regexper-static/
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub
$ cd regexper-static/

安装依赖

进入项目目录后,输入yarn install安装依赖。

1
2
3
4
5
6
7
8
9
10
11
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub/regexper-static (master)
$ yarn install
yarn install v1.12.3
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@1.1.2: The platform "win32" is incompatible with this module.
info "fsevents@1.1.2" is an optional dependency and failed compatibility check. Excluding it from installation.
[3/4] Linking dependencies...
[4/4] Building fresh packages...
success Saved lockfile.
Done in 124.86s.

我这里安装可慢了,耐心等它安装完毕。

启动本地服务器

输入yarn start启动服务器,启动成功的话如下所示:

1
2
3
4
5
6
7
8
9
lan@DESKTOP-8ISAT6B MINGW64 /D/GitHub/regexper-static (master)
$ yarn start
yarn run v1.12.3
$ gulp
[21:32:34] Using gulpfile D:\GitHub\regexper-static\gulpfile.js
......
[21:32:47] Server started http://localhost:8080
[21:32:47] LiveReload started on port 35729

浏览器打开

浏览器打开localhost:8080即可,运行成功效果如下:

以后每次使用都要到该目录/D/GitHub/regexper-static中使用yarn start启动服务器。

bat脚本快速启动

每次手动的来启动本地服务器还是挺麻烦的,这里我用批处理脚本来快速启动.
在桌面中新建.bat文件:启动正则表达式.bat,在启动写入如下的cmd命令:

1
2
3
4
@echo off
D:
cd D:\GitHub\regexper-static
yarn start

命令说明:

  • @echo off:关闭回显
  • D:–启动盘符,这个盘符以克隆到的本地项目的盘符为准
  • cd D:\GitHub\regexper-static–进入到本地项目路径,以自己的为准
  • yarn start–启动本地服务器

这样直接点击桌面的启动正则表达式.bat文件即可启动本地服务器。然后浏览器打开localhost:8080即可使用。

8080端口被占用了

问题描述

今天启动的时候遇到了下面的错误:

1
2
3
4
5
6
7
8
events.js:183
throw er; // Unhandled 'error' event
^
Error: listen EADDRINUSE :::8080
at Server.setupListenHandle [as _listen2] (net.js:1360:14)
......
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

update user set password=password(‘root’) WHERE User=’root’;

原因

regexper用的是8080端口,而我用了tomcat,tomcat已经占用了8080端口。所以导致regexper无法启动。

解决方案

我没有找到regexper中修改端口的办法,但是我知道怎么修改tomcat默认端口,所以修改tomcat的端口,把8080端口让给regexper就行了。

HTML表单是什么

HTML表单是用户和web站点或应用程序之间交互的主要内容之一。它们允许用户将数据发送到web站点。大多数情况下,数据被发送到web服务器,但是web页面也可以自己拦截它并使用它。

form元素

所有HTML表单都以一个<form>元素开始:

1
2
<form action="/my-handling-form-page" method="post">
</form>

这个元素正式定义了一个表单。就像<div>元素或<p>元素,它是一个容器元素,但它也支持一些特定的属性来配置表单的行为方式。它的所有属性都是可选的,但至少要设置action属性和method属性,这被认为是最佳实践。

  • action 属性定义了在提交表单时,应该把所收集的数据送给谁(/那个模块)(URL)去处理。.
  • method 属性定义了发送数据的HTTP方法(它可以是“get”或“post”).

文本输入域

文本输入域 <input> 是最基本的表单小部件

单行文本域

使用<input>元素创建一个单行文本域,该元素的type属性值被设置为text (同样的,如果你不提供type属性,text 是默认值)。如果你指定的type属性的值在浏览器中是未知的(比如你指定 type=”date”,但是浏览器不支持原生日期选择器),属性值text就是是备用值。

如下所示:

1
<input type="text">  <input>

E-mail 地址域

该类型的域通过设置type属性值为email来实现。

1
<input type="email" id="email" name="email" multiple>

当使用 type时, 用户需要在域中输入有效的电子邮件地址;任何其他内容都会导致浏览器在提交表单时显示错误。注意,这是客户端错误验证,由浏览器执行:

multiple可以让用户将多个电子邮件地址输入,相同的输入(以逗号分隔)。在一些设备上(特别是在移动设备上),可能会出现一个不同的虚拟键盘,更适合输入电子邮件地址

密码域

通过type 属性的password值设置该类型域:

1
<input type="password" id="pwd" name="pwd" value="default">

如下所示:

它不会为输入的文本添加任何特殊的约束,但是它会模糊输入到字段中的值(例如,用点或小行星),这样它就不能被其他人读取。
请记住,这只是一个用户界面特性;**除非你安全地提交你的表单,否则它会以明文发送**,这不利于安全——恶意的一方可能会截获你的数据,窃取你的密码、信用卡信息,或者你提交的其他任何东西。保护用户不受此影响的最佳方式是在安全连接上托管任何涉及表单的页面(例如:https://……地址),使得数据在发送之前就已加密。
现代浏览器认识到在不安全的连接上发送表单数据所带来的安全影响,并且已经实现了警告,以阻止用户使用不安全的表单。

搜索域

通过使用 type属性的 search 值设置该类型域:

1
<input type="search" id="search" name="search">
`文本域和搜索域之间的主要区别是浏览器的样式`——通常,搜索字段以圆角和/或给定一个“x”来清除输入的值。然而,还有另外一个值得注意的特性:它们的值可以自动保存到同一站点上的多个页面上自动完成。 ### 电话号码域 通过 type属性的 tel 值设置该类型域:
1
<input type="tel" id="tel" name="tel" value="123456789">

由于世界范围内各种各样的电话号码格式,这种类型的字段不会对用户输入的值执行任何限制(包括字母,等等)。这主要是语义上的差异,尽管在一些设备上(特别是在移动设备上),可能会出现一个不同的虚拟键盘,更适合输入电话号码。

URL 域

通过type属性的url 值设置该类型域:

1
<input type="url" id="url" name="url">
它为字段添加了特殊的验证约束,`如果输入无效的url,浏览器就会报告错误`。 **注意**:URL格式良好,但并不一定意味着它引用了一个实际存在的位置。 ## 多行文本域 多行文本域专指使用 ` textarea和常规的单行文本字段之间的主要区别是,允许用户输入包含硬换行符(即`按回车`)的文本。 在大多数浏览器中,文本区域在右下角有一个拖放操作,允许用户调整它的大小。这种调整能力可以通过使用CSS设置文本区域的resize性质为 none 来关闭。 `

参考链接

https://blog.csdn.net/Com_ma/article/details/78546807
https://blog.csdn.net/K346K346/article/details/48877773
https://blog.csdn.net/wr132/article/details/65635003
https://blog.csdn.net/abc_12366/article/details/79155540
https://blog.csdn.net/wr132/article/details/65635003
https://blog.csdn.net/wandermen/article/details/9254919
https://blog.csdn.net/xhbxhbsq/article/details/78955216