目录
初识Tomcat
Tomcat介绍
Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目 ,Tomcat 服务器还是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
Tomcat目录结构
目录 | 说 明 |
---|---|
/bin | 存放Windows或Linux平台上 用于启动和停止Tomcat的脚本文件 |
/conf | 存放Tomcat服务器的各种配置文件 其中最重要的是server.xml |
/server/lib | 存放Tomcat服务器所需的各种JAR文件 |
/server/webapps | 存放Tomcat自带的两个Web应用:admin应用程序和manager应用程序 |
/commom/lib | 存放Tomcat服务器以及所有Web应用都可以访问的JAR文件 |
/work | Tomcat把由JSP生成的Servlet放于此目录下 |
/webapps | 当发布Web应用时,默认情况下会将Web应用的文件存放于此目录中 |
服务器的URL
URL的组成
url由三个部分组成:协议、主机、端口
例如Tomcat服务器的url是:http://localhost:8080,其中http:是协议,localhost是主机,8080是端口号(如何修改tomcat的端口号在下方关于JSP中有具体方法
认识JSP
JSP简单介绍
JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。简单来说JSP就是Java+HTML+css+JavaScript的结合,JSP就是Java文件。
什么是JSP
JSP(Java Server Pages)是指:
- 在HTML中嵌入Java脚本代码
- 由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码
- 然后将生成的整个页面信息返回给客户端
关于JSP
Q:JSP文件必须运行在Tomcat上吗?可以直接运行在浏览器中吗?
A:不一定是tomcat,其他的应用服务器也可以。tomcat是比较常用的一个,jsp是解析成servlet在后台进行编译,最终向客户端输出普通html代码的。浏览器是客户端,能够解读从服务器端传送过来的html代码,而tomcat是服务器端运行的servlet容器,用来解读jsp成html。jsp在二者层面上的运行不是一个概念。
Q:如何将javaweb项目部署在Tomcat上呢?
首先在server中找到安装好的Tomcat,其中Tomcat必须是Stopped状态,双击进入
在Server Locations中可以设置使用哪个部署(第二个Use Tomcat installation 就是使用Tomcat部署),当设置了Tomcat部署后还需要在下方的Deploy path中设置为webapps。还可以在Ports中设置端口号(Port Number第二行设置端口号,默认为8080)
设置完成之后,项目运行至Tomcat会自动移动到webapps目录下
jsp运行原理
一共通过三个阶段,先翻译,即.jsp翻译成.java,再编译,将.java编译成.class,然后才能执行。
jsp常见错误
404:路径有误 找不到页面
500:代码有误
B/S和C/S技术
B/S和C/S技术比较
BS:(Browser/Server,浏览器/服务器模式),web应用 可以实现跨平台,客户端零维护,但是个性化能力低,响应速度较慢。
CS:(Client/Server,客户端/服务器模式),桌面级应用 响应速度快,安全性强,个性化能力强,响应数据较快
关于B/S
Q:为什么需要基于B/S技术的动态网页?
A:使用动态网页,可以动态输出网页内容、同用户进行交互、对网页内容进行在线更新
Q:B/S技术的特点是什么?
A:如图所示
JSP内置对象及常用方法
JSP注释方法
<%--注释内容--%>( 相当于out.print() )
html的注释方式是:<!--html的注释:在源代码中可见 -->,而jsp注释在源代码中不可见
request(请求)对象
request对象代表的是来自客户端的请求,例如在form表单中填写的信息等是最常见的对象
request的一般get方法
getParameter() 获取到客户端通过表单或url请求参数发送过来的参数值。 getParameterValues() 将同名的参数一次性读入String类型的数组中 getParameterNames() 获取参数名称,返回枚举类型 getMethod() 获得用户提交方式,post或get getServletPath() 获得JSP文件所在项目的路径 getRemoteAddr() 获取客户的IP地址 getServerName() 获取服务器名称 getSserverPort() 获取服务器的端口号 getContextPath() 获取项目名,与getServletPath类似 getHeader(str) 获取HTTP投文件中的指定值 getHeaders(str) 获取表头信息
请求中文乱码处理
request.setCharacterEncoding("UTF-8") 设置request请求字符编码
String uname=new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
String upwd=new String(request.getParameter("pwd").getBytes("ISO-8859-1"),"UTF-8");
取得参值后,通过转码方式将值转成合适的字符集
request获得主机和客户端的信息
getRemoteAddr() | 获得客户主机的IP |
getRemoteHost() | 获得客户主机的名字 |
getLocalAddr() | 获得本地主机的IP |
getLocalHost() | 获得本地主机的名字 |
getServerName() | 获得服务器主机的IP |
getServerPort() | 获得服务器端口 |
1)setAttribute与getAttribute方法都是在服务器端内部执行的,客户端不知道服务器端是否执行过这两个方法。
(2)没有与getParameter方法对应的setParameter方法。
(3)request对象内数据的存活范围:当客户端想服务器端发送一个请求,服务器向客户端返回一个响应后,该请求对象就被销毁了。
response(响应)对象
response对象代表的是对客户端的响应,也就是说可以通过response对象来组织发送到客户端的数据。但是由于组织方式比较底层,所以不建议一般人使用。需要向客户端发送文字时直接用out对象即可。
response对象常用方法
addHeader(String arg0,String arg1) | 向页面中添加头和对应的值 |
addCookie(Cookie arg0) | 添加Cookie信息 |
sendRedirect(String arg0) | 实现页面重定向,URL重写 |
setStatus(int arg0) | 设定页面的响应状态代码 |
setContentType(String arg0) | 设定页面的MIME类型和字符集 |
setCharacterEncoding(arg0) | 设定页面响应的编码类型 |
session(会话)对象
session对象代表服务器与客户端所建立的会话,当需要在不同的JSP页面中保留客户信息的情况下使用,比如在线购物、客户轨迹跟踪等。HTTP是无状态协议,Web Server对每一个客户端请求都没有历史记忆,session用来保存客户端状态信息。
提示:打开一个浏览器就意味着打开了一个session对象,浏览器不关闭,session对象会一直存在(姑且这样认为),且session对象只有一个。如果浏览器关闭重启,会创建新的session对象。session对象生命周期:创建--执行--失效(务必要理解)
session对象常用方法
setAttribute("key",value) | 将参数名和参数值存放在session对象中 |
getAttribute("key") | 获取参数值 |
getAttributeName() | 获取参数名 |
getId() | 获取session对象的ID |
removeAttribute("key") | 移除指定session中参数 |
getCreateTime() | 获得session对象创建的时间,单位毫秒 |
getMaxInactiveInterval() | 获得session对象的有效时间 |
etMaxInactiveInterval() | 设置session对象的有效时间 |
isNew() | 判断是否为一个新客户 |
invalidate() | 使session对象失效 |
application(应用程序)对象
application对象负责提供应用程序在服务器中运行时的一些全局信息。类似于系统的“全局变量”,用于实现用户之间的数据共享。application的生命周期是从application创建到服务器关闭。application的存活范围比request和session都要大。只要服务器没有关闭,application对象中的数据就会一直存在,在整个服务器的运行过程当中,application对象只有一个,它会被所有的用户共享。
application常用方法
getRealPath(String arg0) | 获得指定文件的路径 |
getMimeType(String arg0) | 获取指定的文件格式 |
setAttribute(String arg0,Object obj) | 将参数及参数值保存到application对象 |
getAttribute(String arg0) | 获得application对象属性的值 |
getAttributeNames() | 获得application中所有参数的名字 |
removeAttribute(String arg0) | 移除application对象中指定的参数值 |
getServletInfo() | 获取Servlet的当前版本信息 |
getContext(String arg0) | 获得指定路径的context内容 |
etContextPath() | 获得指定context的路径 |
提示:application对象运行是一直存在服务器中,因此保存这种全局变量相对来说比较占资源,因此不推荐使用。
out(输出)对象
out对象代表了向客户端发送数据的对象,与response对象不同,通过out对象发送的内容将是浏览器需要显示的内容,是文本一级的,可以通过out对象直接向客户端写一个由程序动态生成的HTML文件。
常用的方法除了print和println之外,还包括clear、clearBuffer、flush、getBufferSize和getRemaining,这是因为out对象内部包含了一个缓冲区,所以需要一些对缓冲区进行操作的方法。
作用:输出内容到HTML中。
out对象的方法
append(char c) | 将字符添加到输出流中 |
clear() | 清空页面缓存中的内容 |
close() | 关闭网页流的输出 |
flush() | 网页流的刷新 |
println() | 将内容直接打印在HTML中 |
write() | 与println()方法相似,区别在于println()可以输出各种类型的数据, 而write()只能输出与字符相关的数据。 |
page(页面)对象
page对象是指当前的JSP页面本身,在实际开发中并不常用。
getClass() | 返回当时Object的类 |
hashCode() | 返回此时Object的哈希代码 |
toString() | 将此时的Object类转换成字符串 |
equals(Object obj) | 比较此对象是否与指定的对象相等 |
clone() | 对此对象进行克隆 |
copy(Object obj) | 将此对象复制到指定的对象中 |
config(配置)对象
config对象一般用于页面初始化时传递参数。一般而言很少在页面中使用config对象。
getServletContext() | 获得servletContext值 |
getInitParameter(String arg0) | 获得指定的初始化值 |
getInitParameterNames() | 获得初始化的所有参数,返回枚举值 |
getServletName() | 获得servlet名字 |
equals(Object obj) | 比较此时的对象是否与指定的对象相等 |
toString() | 获得此时对象的值 |
exception(异常)对象
exception对象用来处理页面出现的异常错误。通常在某个页面(比如A.jsp)中加入page指令的errorPage属性来将其指向一个专门处理异常错误的页面(doError.jsp)。
getMessage() | 返回exception对象的异常消息字符串 |
getLocalizedMessage() | 返回exception对象的本地化语言的异常错误。 |
printStackTrace() | 显示异常的栈跟踪轨迹。 |
toString() | 返回关于异常错误的简单消息描述。 |
fillInStackTrace() | 重写异常错误的栈执行轨迹。 |
pageContext(页面上下文)对象
pageContext内置对象是一个比较特殊的对象,它相当于页面中所有其他对象功能的最大集成者,即使用它可以访问到本页面中所有其他的对象。例如前面已经描述的request、response、out和page对象等。由于在JSP中request和response等对象本来就可以通过直接调用方法使用,所以pageContext对象在实际JSP开发中很少使用到。
pageContext常用方法
getRequest() | 返回当前页面中的request对象 |
getResponse() | 返回当前页面中的response对象 |
getSession() | 返回当前页面中的session对象 |
getServletContext() | 返回当前页面中的application对象 |
getPage() | 返回当前页面中的page对象 |
getOut() | 返回当前页面中的out对象 |
getException() | 返回当前页面中的exception对象 |
getServletConfig() | 返回当前页面中的config对象 |
setAttribute(String name) | 给指定的属性名设置属性值 |
getAttribute(String naem) | 根据属性名找到相应的属性值 |
setAttribute(String name, Object obj, int scope) | 在给定的范围内设置相应的属性值 |
getAttribute(String name, int scope) | 在给的范围内获取相应的属性值 |
findAttribute(String name) | 寻找一个属性并返回,如果查找不到则返回null |
removeAttribute(String name) | 通过属性名删除掉某个属性 |
removeAttribute(String name, int scope) | 在指定的某个范围里删除某个属性 |
getAttributeScope(String name scope) | 返回某属性的作用域 |
getAttributeNamesInScope(int scope) | 返回指定范围内的所有属性名的枚举 |
release() | 释放pageContext占据的所有资料 |
forward(String relativeURLpath) | 使用当前页面重导到另一个页面 |
include(String relativeURLpath) | 使用当前位置包含的另一个页面 |
表单查询功能的实现
登录界面(表单验证)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
表单(form)
action 表单提交的地址
method 提交的方式
* get 【默认】 显示在地址栏上面,数据长度有限制
* post 不显示在地址栏上,数据长度无限制
【输入框上面必须要携带 name】
-->
<form action="doLogin.jsp" method="get">
<p>
<input type="text" name="username" placeholder="请输入用户名">
</p>
<p>
<input type="password" name="password" placeholder="请输入密码">
</p>
<p>
<input type="number" name="age" placeholder="请输入年龄">
</p>
<p>
<input type="checkbox" name="habit" value="打球"> A
<input type="checkbox" name="habit" value="打游戏"> B
<input type="checkbox" name="habit" value="打妹妹"> C
<input type="checkbox" name="habit" value="打giegie"> D
</p>
<p>
<button>登录</button>
</p>
</form>
</body>
</html>
处理登录请求界面
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 处理登录请求 -->
<h1>这是处理登录请求的界面</h1>
<%
// 内置用户:sa 123
//获取到用户提交过来的表单信息
String username=request.getParameter("username");//从请求中取数据
String password=request.getParameter("password");//从请求中取数据
//从请求中取数据(类型全都是String 必须自己做转换)
String age=request.getParameter("age");
Integer.parseInt(age);// 将字符串变成数字
String[] ts=request.getParameterValues("habit");//接收到多个具备相同name的值
//遍历
String my_habit="";
for(String habit:ts){
System.out.println(habit);//这一行会显示在页面上嘛?
my_habit+=habit+",";//字符串拼接
}
//存到数据库中 应该是一个数据
out.print(my_habit);//存到数据库
my_habit.split(",");
//可以做登录验证了
if("sa".equals(username)&&"123".equals(password)){
out.print("登录成功");
}else{
out.print("登录失败");
}
//【注册】
%>
技术总结:通过request得到数据,将数据进行判断,打印是否成功
喜欢看的小伙伴可以点点关注博主会持续更新一些JavaWeb的内容