Java web学习
贴士:常见状态码
(1)200:一切正常
(2)300/301:页面重定向(跳转)
(3)404:资源不存在
(4)403:权限不足
(5)500:服务器内部错误(代码有bug)
JSP:就是在HTML里嵌套java代码
JSP九大内置对象(自带的,不需要new也能使用的对象)
Out向客户端输出对象
pageContext
request请求对象
reponse
session
application
config
page
exception
1JSP:动态网页
静态、动态:
1.不用和是否有“动感”混为一谈
2.是否随着时间、地点、用户操作 的改变而改变
动态网页需要使用到服务端脚本语言(JSP)
2架构
CS:Client Server
CS不足:
a.如果软件升级,那么全部软件都需要升级
b.维护麻烦:需要维护每一台客户端软件
c.每一台客户端都需要安装客户端软件
BS :Broswer Server
客户端可以通过浏览器 直接访问服务端
注意:bs和cs各有优势。
3.tomcat解压后目录:
bin:可执行文件(startup.bat shutdown.bat)
conf:配置文件(server.xml)
lib:tomcat依赖的jar文件
log:日志文件(记录出错等信息)
temp:临时文件
webapps:可执行的项目(将我们开发的项目放入该目录)
work:存放由jsp翻译成的java,以及编辑成的class文件(jsp ->java ->class)
4.配置tomcat
a.配置jdk (必须配置JAVA_HOME)
java_home classPath path
b.配置catalina_home
双击bin/startup.bat启动tomacat,
常见错误:可能与其他服务的端口号冲突
tomcat端口号默认8080 (此端口号较为常见,容易冲突),建议修改此端口(8888)
修改端口号:
5.访问tomcat
http://localhost:8888/
jsp:在html中嵌套的java代码
在项目/WEB-INF/web.xml中设置默认的初始页面
index.jsp
6.虚拟路径
a.方式一
将web项目配置到 webapps以外的目录
conf/server.xml中配置
host标签中:
docBase:实际路径
path:虚拟路径 (绝对路径、相对路径【相对于webapps】)
重启
b.方式二
D:\study\apache-tomcat-8.5.30\conf\Catalina\localhost
中新建 “项目名.xml”中新增一行:
7.虚拟主机
通过www.test.com访问本机
a. conf/server.xml
b.C:\Windows\System32\drivers\etc\host
增加
127.0.0.1 www.test.com
流程:
www.test.com ->host找映射关系 ->server.xml找Engine的defaultHost->通过"/"映射到D:\study\JspProject
为了后续学习,将以上恢复成默认
7.JSP执行流程
jsp- java(Servlet文件) -class
D:\study\apache-tomcat-8.5.30\work\Catalina\localhost\JspProject\org\apache\jsp
Jsp 和Servlet 可以相互转换
因为第一请求服务端会有翻译和编译的过程,因此比较慢;后续访问可以直接访问class,因此速度较快。但是如果服务端修改了代码,则再次访问时 会重新的翻译、编译。
1.使用Eclipse开发Web项目(JSP项目) tomcat
2. 在Eclipse中创建的Web项目:
浏览器可以直接访问WebContent中的文件,
例如http://localhost:8888/MyJspProject/index1.jsp
其中的index1.jsp就在WebContent目录中;
但是WEB-INF中的文件 无法通过客户端(浏览器)直接访问,只能通过请求转发来访问
注意:并不是任何的内部跳转都能访问WEB-INF;原因是跳转有2种方式:请求转发、重定向
3.配置tomcat运行时环境
jspServlet
a.将tomcat/lib中的servlet-api.jar加入项目的构建路径
b.右键项目->Build Path -> Add library->Server Runtime
4.部署tomcat
在servers面板新建一个 tomcat实例, 再在该实例中部署项目(右键-add)
之后运行
注意:一般建议将eclipse中的tomcat与本地tomcat的配置信息保持一致:将eclipse中的tomcat设置为托管模式:【第一次】创建tomcat实例之后,双击,选择Server Location的第二项
5.统一字符集编码
a.编码分类:
设置jsp文件的编码(jsp文件中的pageEncoding属性): jsp -> java
设置浏览器读取jsp文件的编码(jsp文件中content属性)
一般将上述设置成一致的编码,推荐使用UTF-8
文本编码:
i.将整个eclipse中的文件统一设置(推荐)
ii.设置某一个项目
iii.设置单独文件
6.
JSP的页面元素: HTML java代码(脚本Scriptlet)、指令、注释
a.脚本Scriptlet
i.
局部变量、java语句
%>
ii.
全局变量、定义方法
%>
iii.
输出表达式 %>
一般而言,修改web.xml、配置文件、java 需要重启tomcat服务
但是如果修改 Jsp\html\css\js ,不需要重启
注意,out.println()不能回车;要想回车:“”,即out.print() 可以直接解析html代码
b.指令
page指令
page指定的属性:
language:jsp页面使用的脚本语言
import:导入类
pageEncoding:jsp文件自身编码 jsp->java
contentType:浏览器解析jsp的编码
pageEncoding="UTF-8" import="java.util.Date" %>
c.注释
html注释 ,可以被客户通过浏览器查看源码所观察到
java注释// /*...*/
jsp注释
7.JSP九大内置对象(自带的,不需要new 也能使用的对象)
一、out:输出对象,向客户端输出内容
二、request:请求对象;存储“客户端向服务端发送的请求信息”
request对象的常见方法:
(1)StringgetParameter(String name) :根据请求的字段名key (input标签的name属性值) ,返回字段值value (input标签的value属性值)
(2)String[]getParameterValues(String name): 根据请求的字段名key ,返回多个字段值value (checkbox)
(3)voidsetCharacterEncoding("编码格式utf-8"):设置post方式的请求编码 (tomcat7以前默认iso-8859-1,tomcat8以后改为了utf-8)
(4)getRequestDispatcher("b.jsp").forward(request,response); :请求转发 的方式跳转页面 A - > B
(5)ServletContextgetServerContext():获取项目的ServletContext对象
示例:
注册
register.jsp ,show.jsp
http://localhost:8888/MyJspProject/show.jsp?uname=aa&upwd=123&uage=22&uhobbies=%E7%AF%AE%E7%90%83
连接/文件?参数名1=参数值1 & 参数名2=参数值2 & 参数名1=参数值1
get提交方式: method="get" 和地址栏、超链接()请求方式默认都属于get提交方式
注意:get与post请求方式的区别
(1)get方式:在地址栏显示 请求信息 (但是地址栏能够容纳的 信息有限,4-5KB;如果请求数据存在大文件,图片等 会出现地址栏无法容纳全部的数据而出错) ;post不会显示
(2)文件上传操作,必须是post
推荐使用post
8.统一请求的编码 request
get方式请求如果出现乱码,解决:
a.统一每一个变量的编码(不推荐)
new String( 旧编码,新编码);
name = new String(name.getBytes("iso-8859-1"),"utf-8");
b. 修改server.xml ,一次性的更改tomcat默认get提交方式的编码(utf-8)
建议使用tomcat时,首先在server.xml中统一get方式的编码..URIEncoding="UTF-8"
tomcat7(iso-8859-1)
tomcat8(utf-8)
post
request.setCharacterEncoding("utf-8");
注册页面:
page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTDHTML 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>注册title>
head>
<body>
<form action="show.jsp"method=post accept-charset="UTF-8">
用户名:<input type="text" name="uname"/><br/>
密码:<input type="password" name="upwd"/><br/>
年龄:<input type="text" name="uage"/><br/>
爱好<br/>
<input type="checkbox" name="uhobbies"value="足球"/>足球,
<input type="checkbox" name="uhobbies"value="篮球"/>篮球,
<input type="checkbox" name="uhobbies"value="乒乓球"/>乒乓球<br/>
<input type="submit" value="注册">
form>>
body>
html>
跳转后显示页面:show.jsp
page language="java" contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%>
DOCTYPE html PUBLIC "-//W3C//DTDHTML 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>Insert title heretitle>
head>
<body>
//设置统一编码
request.setCharacterEncoding("utf-8");
String name=request.getParameter("uname");
int age=Integer.parseInt(request.getParameter("uage"));//将字符串转换成整数
String pwd=request.getParameter("upwd");
String[] hobbies=request.getParameterValues("uhobbies");
%>
注册成功,信息如下:<br/>
姓名:name %><br/>
年龄:age %><br/>
密码:pwd %><br/>
爱好: <br/>
if(hobbies !=null){
for(String hobby :hobbies){
out.print(hobby+" ");
}
}
%>
body>
html>
二、response :响应对象
提供的方法:
(1)void addCookie( Cookiecookie ); 服务端向客户端增加cookie对象
(2)void sendRedirect(Stringlocation ) throws IOException; :页面跳转的一种方式(重定向)
(3)voidsetContetType(String type):设置服务端响应的编码(设置服务端的contentType类型)
测试:
但是会导致数据丢失;
使用请求转发重写check.jsp里的java方法
请求转发与重定向:
请求次数问题:
请求转发:只有一次请求,一次响应;
重定向:两次请求,两次响应;
示例:登陆
login.jsp -> check.jsp ->success.jsp
面试常考:
请求转发(request) | 重定向(response) | |
地址栏是否改变 | 不变(check.jsp) | 改变(success.jsp) |
是否保留第一次请求时的数据 | 保留 | 不保留 |
请求的次数 | 1 | 2 |
跳转发生的位置 | 服务端 | 客户端发出的第二次跳转 |
转发、重定向:
转发:
张三(客户端) -> 【 服务窗口 A (服务端 ) -> 服务窗口B 】
重定向:
张三(客户端) -> 服务窗口 A (服务端 ) ->去找B
张三(客户端) -> 服务窗口 B (服务端 ) ->结束
三、 session(服务端)
Cookie(客户端,不是内置对象):Cookie是由服务端生成的 ,再发送给客户端保存。
相当于 本地缓存的作用:客户端(hello.mp4,zs/abc)->服务端(hello.mp4;zs/abc)
作用:提高访问服务端的效率,但是安全性较差。
Cookie: name=value
javax.servlet.http.Cookie
publicCookie(String name,String value)
StringgetName():获取name
StringgetValue():获取value
voidsetMaxAge(int expiry);最大有效期(秒)
服务端准备Cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取cookie: request.getCookies();
a.服务端增加cookie :response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将 全部的cookie拿到
通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie
建议 cookie只保存 英文数字,否则需要进行编码、解码
3. 使用Cookie实现 记住用户名 功能
4.session:会话
a.浏览网站:开始-关闭
b.购物: 浏览、付款、退出
c.电子邮件:浏览、写邮件、退出
开始-结束
session机制:
客户端第一次请求服务端时,(jsessionid-sessionid)服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象 都会有一个唯一的 sessionId( 用于区分其他session);
服务端会 产生一个cookie,并且 该cookie的name=JSESSIONID,value=服务端sessionId的值;
然后 服务端会在 响应客户端的同时将该cookie发送给客户端,至此 客户端就有了 一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID - sessionID)
客户端第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功(cookie jsessionid和sesion sessionid),说明此用户 不是第一次访问,无需登录;
例子:
客户端: 顾客(客户端)
服务端: 存包处 - 商场(服务端)
顾客第一次存包:商场 判断此人是之前已经存过包(通过你手里是否有钥匙)。
如果是新顾客(没钥匙) ,分配一个钥匙 给该顾客;钥匙 会和 柜子 一一对应;
第二/n次 存包:商场 判断此人是 之前已经存过包(通过你手里是否有钥匙)
如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙 会 和柜子 自动一一对应。