Web
动态与静态
动态,并不是动感的效果,而是网页会处理用户请求并反馈,会随着时间的变化做出相应的改变,比如我们看到的天气预报,打开页面就是当日的天气。
动态网页是运行在服务端的,根据不同用户,不同时间返回不同的网页。
静态网页不是随时改变的,用于唯一url,每个网页文件都是独立的
Tomcat目录结构
tomcat三个核心:
(1)Web容器—处理静态页面;
(2)catalina — 一个servlet容器-----处理servlet;
(3)还有就是JSP容器,它就是把jsp页面翻译成一般的servlet。
Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。
在Tomcat目录结构有不同用处:
一般我们创建的网页在webapps中
在Tomcat/webapps下的每个项目文件可能会有一个WEB-INF文件,是Java的WEB应用的安全目录,客户端无法访问,只有服务端可以访问。
WEB-INF文件目录:
- Web.xml项目部署文件
- classes文件夹存放字节码文件(*.class)
- lib文件夹,存放jar包
一般Tomcat端口默认8080,如果和其他程序发生冲突我们可以找到conf文件找到server.xml
修改端口
JSP
JSP全名为Java Server Pages,其根本是一个简化的Servlet设计,它实现了在Java当中使用HTML标签。Jsp是一种动态网页技术标准也是JAVAEE的标准。JSP与Servlet一样,是在服务器端执行的。
动态网站开发技术对比:
- Jsp: Java平台,安全性高,适合开友大型的,企业级的weD业用任厅。
- Asp.net:.Net平台,简单易学。但是安全性以及跨平台性差。
- Php:简单,高效,成本低开发周期短,特别适合中小型企业的Web应用开发。(LAMP : Linux+ Apache+ MySQL+PHP )
JSP页面元素的构成:
- 注释
- 声明
- 指令
- 静态内容
- 表达式
- 小脚本
jsp指令
1、page指令:
语法:<%@ page 属性1=“属性值” 属性2=“属性值”……属性n=“属性值”%>
属性 | 描述 | 默认值 |
---|---|---|
language | 指定JSP页面使用的脚本语言 | java |
import | 通过该属性来引用脚本语言使用的类文件 | 无 |
contentType | 用来指定JSP页面所采用编码方式 | text/html IOS-8859-1 |
2、include 页面包含
指令语法
<%@ include file=“URL”%>
动作语法:<%@include page=“URL” flush=“true/false”/>
page表示要包含页面 flush表示包含的页面是否从缓冲区读入
区别:
jsp:include动作在请求期间被执行,而include指令在编译期页面间被执行
3、taglib 引入标签库
JSP注释
在JSP页面的注释:
- HTML格式的注释:<–html–>//客户端可见(查看源代码)
- JSP注释:<%–jsp–%>//客户端不可见
- JSP脚本注释://单行 /**/多行 //客户端不可见
JSP脚本
<%
out.println("大家好")
%>
JSP基础语法
<%! Java代码%>
<%!
String s = "zhang";
int add(int x,int y){
return x+y;
}
%>
<%! =表达式%> //主要表达式后不写分号
你好<%=s%>
x+y=<%=add(1,2)%>
根据上面代码可知我们在页面显示:你好zhang x+y=3
生命周期
JSP生命周期就是从创建到销毁的整个过程,类似于servlet生命周期,区别在于JSP生命周期还包括将JSP文件编译成servlet。
解析阶段
Servlet容器解析JSP文件代码,如果有语法错误,就会向客户端返回错误信息
翻译阶段
Servelet容器把JSP文件翻译成Servelet源文件
编译阶段
Servelet容器编译Servelet源文件,生成servelet
初始化阶段
加载与JSP对应的Servelet类,创建其实例,并调用它的初始化方法
运行时阶段
调用与JSP对应的Servelet实例的服务方法
销毁阶段
调用与JSP对应的Servelet实例的销毁方法,然后销毁Servelet
jspService()方法被调用来处理客户端的请求。对每一个请求,JSP引擎创建一个新的线程来处理该请求。如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量及响应时间。但也要注意多线程的编程带来的同步问题,由于该Servlet始终驻于内存,所以响应是非常快的。
jsp语法小练习:
页面中打印九九乘法表:
java代码版:
//java语句内置
<%!
String printMultiTable() {
String s ="";
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
s+=i+"*"+j+"="+(i*j)+" ";
}
s += "<br/>";
}
return s;
}
%>
<%= printMultiTable() %>//表达式
jsp脚本版:
<%!
void print(JspWriter out)throws IOException {
for (int i = 1; i <= 9; i++) {
for (int j = 1; j <= i; j++) {
out.print(i+"*"+j+"="+(i*j)+" ");
}
out.print("<br/>");
}
}
%>
<%print(out);%>
JSP状态管理-Cookie
Cookie:是Web服务器保存在客户端的一系列文本信息
典型应用一:判定注册用户是否已经登录网站
典型应用二:“购物车”处理
作用:
- 对特定对象跟踪
- 保存用户浏览记录与习惯
- 简化登录
安全风险:容易泄露用户信息
Cookie创建与使用
创建Cookie对象
写入对象
读取对象
Cookie cookie = new Cookie(String key,Object value);
response.addCookie(newCookie);
Cookie[] cookies = request.getCookies();
JSP内置对象
- out
- request
- response
- session
- application
- 不常用:
– Page
– PageContext
– exception
– config
out
<%
out.print("<h2>静夜思</h2>");
%>
缓冲区大小:<%=out.getBufferSize()%>byte<br/>
缓冲区剩余大小:<%=out.getRemaining()%>byte<br/>
是否自动清空缓冲区:<%=out.isAutoFlush()%><br/>
GET与POST
<form name="regForm" action=“动作” method=“提交方式"”>
</form>
GET:以明文的方式通过URL提交数据,数据在URL中可以看到。提交的数据最多不超过2KB。安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。比如∶搜索、查询等功能。
POST: 将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全
性高的用户信息。比如∶注册、修改、上传等功能。
request对象
客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。常用方法如下∶
这里需要知道,对于一个表单我们要知道其属性的用法:
表单的数据提交的方式method/http请求数据的方式有两种:(写在中)
get提交:会将用户的信息显示在url地址栏中,不安全,最大长度不能超过255个字符
post提交:不会将用户的数据显示在url地址栏中,安全,提交数据量大
<form>中action属性:指数据提交到的路径地址
<input />中type属性的值:
- text(文本类型)
- password(密码类型)
- checkbox(复选框)
- radio(单选框)
- submit(表单数据的提交)
- reset(重置数据)
- 表单轮廓outline: 0/none;(取消轮廓)
outline:5px soild red;
例子:
<form action="index.jsp" method="get" class="login">
<p>login</p>
<input name="account" placeholder="用户名" type="text">
<input type="password" name="password" placeholder="密码">
<input type="submit" class="btn" value="登录">
</form>
response对象
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。常用方法如下:
使用PrintWriter生成的对象打印的信息总是先于out
<%
out.print("<h1>这是out对象输出</h1>");
PrintWriter outer = response.getWriter();
outer.print("<h2>这是outer(PrintWriter)对象输出");
%>
当然我们可以使用flush方法来解决这个问题
<%
out.print("<h1>这是out对象输出</h1>");
out.flush();
PrintWriter outer = response.getWriter();
outer.print("<h2>这是outer(PrintWriter)对象输出");
%>
请求转发与请求重定向
-请求重定向︰客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
-请求转发︰服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变。
重定向∶你先去了A局,A局的人说:“这个事不归我们管,去B局”,然后,你就从A退了出来,自己乘车去了B局。
转发∶你去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会儿,自己到后面办公室联系了B的人,让他们办好后,送了过来
如果我们在表单中action里填写response.jsp,在response中调用重定向方法response.sendRedirect()方法给request.jsp,此时在request使用表达式得不到用户名和密码。
response.jsp
<%
response.sendRedirect("request.jsp");
%>
request.jsp
用户名:<%=request.getParameter("account")%>
<br/>
密码:<%=request.getParameter("password")%>
<hr/>
显示空,且地址栏会变
如果使用转发在response中使用
request.getRequestDispatcher(“request.jsp”).forward(request,response);
显示request内容地址栏不变(response.jsp)
session
session表示客户端和用户端的一次会话,Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间
session对象是HttpSession类实例
session生命周期
创建:
当客户端第一次访问某个jsp或者Servlet时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验。
活动:
- 某次会话当中通过超链接打开的新页面属于同一次会话。
- 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
- 除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。
–注意原有会话id依然存在,只是旧的Session仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务器校验
销毁:
三种方法:
1.调用session.invalidate()方法
2.Session过期(超时)
3.服务器重新启动
设置Session超时
- session.setMaxInactiveInterval
- 在web.xml配置:
<session-config>
<session-tionout>
分钟
</session-timeout>
</session-config>
application
- application对象实现了用户间数据的共享,可存放全局变量。
- application开始于服务器的启动,终止于服务器的关闭。
- 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
- 在任何地方对application对象属性的操作,都将影响到对其他用户对此的访问。
- 服务器的启动和关闭决定了application对象的生命周期
- application是ServletContext类的实例。
常用方法:
Page
page对象就是指向当前JSP页面本身,有点像类中的this指针,它是java.lang.Object类的实例。常用方法如下:
pageContext
- pageContext对象提供了对JSP页面内所有的对象及名字空间的访问
- pageContext对象可以访问到本页所在的session,也可以取本页面所在的application的某一属性值
- pageContext对象相当于页面中所有功能的集大成者
- pageContext对象的本类名也叫pageContext。
config
config对象是在一个Servlet初始化时,JSP引擎向它传递信息用的,此信息包括
Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象),常用方法如下:
exception
exception对象是一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象,常用方法如下:
Session与Cookie对比
cookie保存对象大小有限制