CS: customer server 如微信
BS:Browser server 浏览器端 如 Chrom
启动 tomcat:bin/startup.sh
关闭:bin/shutdown.sh
JSP 中写java 代码: Jsp: 就是在html 中嵌套Java 代码
<body>
hello jsp222...
<% // 这里面方java 代码
out.print("hello jsp...");
%>
</body>
配置虚拟路径
将web项目配置到webapp 以外的路径
/Users/x/MyFile/Java/JavaWeb/tomcat-8.5.38/conf/server.xml 配置文件中包含Host 的虚拟路径配置:
原配置
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Valve className="org.apache.catalina.valves.AccessLogValve"
directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b"
/>
</Host>
目前配置的就是 appBase="webapps 所以可以识别这个目录下的东西
在Host 标签中添加:
<Context docBase="" path=""/>
docBase: 实际路径
Path 虚拟路径(绝对或者相对路径(相对于webapps的路径))
<Context docBase="/Users/x/MyFile/Java/JavaWeb/jpsProject"
path="/jpsProject"
/>
当url 访问 http://localhost:8080/jpsProject/ 就会跳到"/Users/x/MyFile/Java/JavaWeb/jpsProject" 去找工程
上面那种方式,总是需要重启
方式2
新建:
/Users/x/MyFile/Java/JavaWeb/tomcat-8.5.38/conf/Catalina/localhost/jpsProject.xml, 新建文件的名字就是你的那个新建项目名称
写配置:
<Context docBase="/Users/x/MyFile/Java/JavaWeb/jpsProject" path="/jpsProject" />
可以直接奖文件命名为 ROOT, 那么默认就会使用配置作为默认页面
虚拟主机
还是在server.xml 新加配置
<Host appBase="Users/xuxliu/MyFile/Java/JavaWeb/jpsProject" name="www.test.com">
<Context docBase="Users/xuxliu/MyFile/Java/JavaWeb/jpsProject" path="/" />
</Host>
新添加:<Engine name="Catalina" defaultHost="www.test.com">
创建的web 项目,浏览器中直接可以访问index.jsp 文件但是WEB-INF 中的文件,无法直接通过浏览器访问,只能通过请求转发访问
Jsp 的页面可以写的东西:
- Scriptlet 脚本
定义局部变量、
<%
String name = "xxxxx";
System.out.println(name);
%>
定义全局变量及方法
<%!
String name = "xxxxx";
out.println(name);
%>
<%= 输出表达式%>
还可以有:
指令(Page 指令)
<%@ page contentType="text/html;charset=UTF-8" language="java"
import="java.util.Date"
%>
Jsp 内置的那些方法,不需要new, 可以直接使用,如:out.println(name);
还有的内置对象:Out:向客户端输出
pageContext:
request、请求对象,存储客户端向服务端发送的请求技术,常见方法
String getParamater(String name) 根据key 返回 value input 标签的内部属性
String[] getParamaterValues(String name)
setCharacterEncoding(“编码格式utf-8”) 设置请求编码
getRequestDispatcher().forward(request, response) 请求转发 A -> B
serveletContext getServerContext() 获取当前serveletContext 对象
<form action="show.jsp">
<%--
将表单提交到 show.jsp, getParamater 会根据 name 取到 value
--%>
用户名: <input type="text" name="uname" value="张三"><br>
密码: <input type="password" name="upwd" value="zhangsan"><br>
年龄: <input type="text" name="uage" value="12"><br>
爱好: <br>
<input type="checkbox" name="hobbies" value="足球"> 足球
<input type="checkbox" name="hobbies" value="篮球"> 篮球
<input type="checkbox" name="hobbies" value="兵乓球"> 兵乓球
<input type="submit" value="注册"><br>
</form>
提交后的url变化,默认会使用get 提交方式(超链接<a href=xxx>)
Response:相应对象
提供的方法
Void addCookie(Cookie cookie) 服务端详客户端增加cookie 对象
Void sendRedirect(String location) 页面跳转的方式,
response.sendRedirect("success.jsp"); 重定向
Void setContentType(String type) 设置服务端响应的编码(设置服务端的 ContentType 类型)
请求转发:
request.getRequestDispatcher("success.jsp").forward(request, response);
重定向与请求转发:
response.sendRedirect("success.jsp");
页面跳转 重定向会到时数据丢失
请求转发,可以获取到数据,并且地址栏没有改变,任然转发、
转发时候的request 第一次请求是的数据
而且请求转发 页面地址不会改变,而重定向 则会发送改变
请求次数,请求转发 的请求次数只有一次,(页面会在服务器跳到正确页面,然后返回)
而重定向会出现2次,(页面在服务器中,给客户端说你找错页面了,然后返回正确的页面客户端在去请求正确的页面)
重定向 的发出请求地方是 客户端
请求转发 转发除地方是 服务器
Session和Cookie分别是在服务端和客户端通过记录信息确定用户 。cookie和session只是为了解决http协议无状态的这种缺陷,为了记录用户信息,记录浏览器和服务器之间的状态和衍生出来的。
cookie是一种在客户端记录用户信息的技术,因为http协议是无状态的,为了解决这个问题而产生了cookie。记录用户名等一些应用
session是一种在服务端记录用户信息的技术,一般session用来在服务器端共享数据,
一个简单的例子说明二者得联系与区别
Cookie和Session之间的区别和联系
假如一个咖啡店有喝5杯咖啡免费赠一杯咖啡的优惠,然而一次性消费5杯咖啡的机会微乎其微,这时就需要某种方式来纪录某位顾客的消费数量。想象一下其实也无外乎下面的几种方案:
1、该店的店员很厉害,能记住每位顾客的消费数量,只要顾客一走进咖啡店,店员就知道该怎么对待了。这种做法就是协议本身支持状态。但是http协议本身是无状态的
2、发给顾客一张卡片,上面记录着消费的数量,一般还有个有效期限。每次消费时,如果顾客出示这张卡片,则此次消费就会与以前或以后的消费相联系起来。这种做法就是在客户端保持状态。也就是cookie。 顾客就相当于浏览器,cookie如何工作,下面会详细讲解
3、发给顾客一张会员卡,除了卡号之外什么信息也不纪录,每次消费时,如果顾客出示该卡片,则店员在店里的纪录本上找到这个卡号对应的纪录添加一些消费信息。这种做法就是在服务器端保持状态。
由于HTTP协议是无状态的,而出于种种考虑也不希望使之成为有状态的,因此,后面两种方案就成为现实的选择。具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。同时我们也看到,由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上它还有其他选择
Cookie 就是本地缓存(客户端),是由服务器创建并发到客户端后保存下来,当你第二次访问的 时候就直接在本地缓存中访问,而不需要在去服务器请求了。提高访问服务器的效率,但是安全性较差。 key=value 采用的是key value 保存方式。
这个对象是javax.servelet.http.Cookie 构造方法,及拥有的方法
方法:
Public Cookie(String key, String value)
getName、setName、getVlaue、setName
setMaxAge(int expiry): 设置最大有效期,单位 秒
application、config、page、exception
服务端发送给客户端:Response.addCookie(Cookie cookie)
客户端获取 cookie:Request.getCookie()
Cookie 得使用:
记住用户名
登录时,在服务器端获取到用户名,然后创建一个cookie,将用户名存入cookie中,发送回浏览器端,然后浏览器下次在访问登录页面时,先拿到cookie,将cookie中的信息拿出来,看是否保存了该用户名,如果保存了,那么直接用他,如果没有,则自己手写用户名。
历史记录
比如购物网站,都会有我们的浏览记录的,实现原理其实也是用cookie技术,每浏览一个商品,就将其存入cookie中,到需要显示浏览记录时,只需要将cookie拿出来遍历即可。
Session: 会话
如浏览网站,从开始到网页浏览器关闭才是一次会话 电子邮件,从浏览、写、发、退出,是一次会话
Session机制
客户端第一次请求服务端的时候,服务端会产生一个session对象,用于保存该对象的用户信息,并且每个session对象有一个唯一的sessionID 用于区分其他session,服务端会产生一个cookie,并且该cookie的name=JESSIONID,JESSIONID 的value=服务端sessionID的值,然后服务端会在响应客户端的同时,讲该cookie发送给客户端,至此客户端会有了一个cookie(JESSIONID),因此客户端的cookie就可以和服务端的session一一对应起来(JESSIONID - sessionID),保证每个用户有一个session,
第n次(n>1)次请求的时候,根据客户端的JESSIONID 和服务器端的sessionID,如果匹配那么就说这个用户不是第一次登录,
Session:
String getId() 获取sessionId
Boolean isNew() 是否新用户
Void invalid() session失效,在开发的时候注销和退出登录的时候会使用到
setAttribute()
getAttribute()
session中可以存放:用户名、密码
Void setMaxInactiveInterval(秒)设置有效最大非活动时间,多少时间没操作那么需要重新登录。
Int getMaxInactiveInterval()
session.removeAttribute("uname"); 指定属性移出
session 同一次会话共享,(需在同一种浏览器中)
登录后,直接访问a.jsp 或者 b.jsp 都是可以的,此时的session 都是共享的,好比当你登录淘宝的之后,你在去打开一个擦混个口去浏览淘宝此时依旧是登录状态,可以直接访问,但是当你关闭浏览器之后,这次的session就结束了,再次打开淘宝网页,那么久需要重新登录了。
session 和 cookie 的异同:
保存位置:服务端 客户端
安全性: 较安全 较不安
Cookie不是内对象,要使用必须new,但是服务端会自动new生产一个name=JSEESIONID的cookie,并返回给客户端,