B/S结构
Broswer/Server,用浏览器作为软件界面。
C/S结构
Client/Server ,软件界面不在浏览器中。
HTTP协议
协议的作用:协议是用于在两台电脑之间通信的规则。
TCP/IP协议:TCP/IP是一组协议,其中包括了HTTP协议也包括UDP协议。
超文本传输协议,用在浏览器中。例如http://www.baidu.com。
WEB容器
是web程序运行的环境。
JSP
jsp是java服务页。就是吧Java代码写在html中。
JSP的构成
-
指令,3种。page指令,taglib指令,include指令。用<%@ %>包含住
-
小脚本 scriptlet,在在html中编写的java代码称为小脚本。小脚本必须以<%开头,以%>结尾
-
Expression表达式,向浏览器输出的内容。<% %>
-
Declare声明,在jsp页面中定义的方法。
-
注释,HTML注释 。JSP注释,<%-- --%>
JSP执行的过程
-
翻译
将JSP文件翻译成Java源文件,在web容器中自动完成。在第一个用户第一次对jsp文件发出请求时完成。tomcat将翻译后的Java类保存在了tomcat的根目录下。翻译后的文件名是 原来的jsp文件名_jsp.java。
-
编译
将java源文件编译成字节码文件
-
运行
运行解释运行字节码文件,调用_jspService方法,将页面发送给浏览器
第二次运行的时候直接运行。
注意:有时候在修改了jsp文件的情况下,tomcat没有重新编译和翻译,而是运行了修改前的代码。导致修改的jsp没有生效。就时候就要找到Tomcat页面,删除里面的work目录,重新执行让Tomcat重新编译。
请求
请求的报文就是指向服务器发送的所有信息。
-
状态行
-
请求报头
-
空行
-
请求正文
内置对象
内置对象是指由web容器创建的,在jsp中可以直接使用的对象,这样的对象称为内置对象。
- web容器new,自己不可以new
- 内置对象只能在JSP文件中使用
- JSP的内置对象一共有九个,request,response,out,session,application,page,pageContext,config,exception。
内置对象out
用于向浏览器输出HTML代码·。是JSP的内置对象
注意:System.out.print()是将数据发送到web服务器
out是将数据发送到客户端浏览器。
乱码的解决办法
在获取数据之前设置编码格式,只能解决以post方法提交的中文乱码
request.setCharacterEncoding("utf-8");
get提交乱码的解决办法
-
Tomcat6以前
通过new String来改变编码格式。
String course = new String(course.getBytes("iso-8859-1"),"utf-8");
-
Tomcat7及其以后,
conf目录下的server.xml配置文件中配置的代码中设置了编码方式。
内置对象response
重定向:就是重新打开一个网页。
实现:response.sendRedirect(url)方法实现。url:就是重定向的地址。
执行过程:
1.web服务器向客户端浏览器发送响应的状态码302,和重定向的地址url.
2.浏览器在获得状态码302和url后,向浏览器url重新发出请求。
重定向一共请求两次。
响应的内容类型
web服务器可以给浏览器响应网页源代码,响应图片,响应下载的文件,响应pdf文件。服务器可以给响应给浏览器中的内容设置类型。
MIME(Multipurpose Internet Mail Extensions)多用途互联网邮件扩展类型
response.setContentType(Sting) String 表示MIME的格式。
response.setContentType("text/html;charset=utf-8")发送网页的源代码
response.setContentType("image/*")发送图片给浏览器,*表示所有图片的格式。
设置响应的编码
response.setCharacterEncoding("utf-8")
中文编码的类型:GBK,2个字节表示一个汉字,
GB2313,2个字节表示一个汉字
urf-8,3个字节表示一个汉字
Big5 大五码,表示繁体字
向浏览器响应的内容
response对象的getWrite()方法返回的PrintWriter对象能够像客户端浏览器发送数据。
PrintWrite out=response.getWriter();
out.print();
内置对象exception
表示异常,在jsp页面中有两种提示错误信息的办法。一种是局部提示,一种是全局提示。
局部提示:
首先设置一个专门提示错误的页面,当其他页面发生错误时,就会跳转到这个页面。由这个页面提示错误。
isErroPagr="true";//指定的页面
errorPag="error.jsp"
缺点:每个页面都要单独设置error属性,很繁琐。
全局提示:
无论是哪一个文件出错,都有统一的一个文件来显示某一错误。
首先指定一个页面是专门显示所有错误的页面。
在web.xml文件中进行全局错误的配置。
<error-page>
<error-code>404</error>
<location>/exception/error.jsp</location>
</errorpage>
请求转发
请求转发:就是对一次请求进行一次或多次转发。
实现
request.getRequestDispatcher("userlist.jsp").forward(request,response)
请求转发与重定向的区别:
- 重定向时浏览器地址栏显示的是最后一次重定向地址的url.请求转发时,浏览器地址栏显示的是第一个请求文件的url.
- 请求转发时,浏览器界面显示的数据来自于最后转发的url.
- 重定向是每定向一次就请求一次,请求转发是一次请求,多次转发.
- equest内置对象是可以存储和获取数据的.
request.getParameter()获取的客户端向浏览器提交的数据。
request对象本身还可以存储数据,通过调request.setAttribute(key,value)向request对象中存储数据。存储到request对象中的数据还可以被转发到下一个url,在下一个url中可以通过request.getAttribute(key)来获取数据。
请求转发与重定向常见的问题
即写了重定向,又写了请求转发。后运行就会发生错误。重定向后不允许再请求转发,建议在重定向后添加return语句。
cookie
cookie
cookie是客户端浏览器帮助服务端tomcat保存信息的一种机制。这些被保存的信息可以在以后的请求与响应中实现在客户端浏览器与服务端tomcat之间来回传递。
例子:
用户登录后,显示用户上次登录的时间。
//1.服务端向客户端写cookie
String date=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
Cookie cookie=new Cookie("date",date);
response.addCookie(cookie);
//客户从浏览器中读取
Cookie[] cookies=request.getCookies();
if(cookies!=null && cookies.length>0){
for(int i=0;i<cookies.length;i++){
if("date".equals(cookies[i].getName())){
String cookievalue = cookies[i].getValue();
}
}
}
cookie的保存问题
-
临时保存
cookie是保存到浏览器中的String类型的数据,默认保存到浏览器内存中。
当浏览器关闭后,cookie就失效了,这种cookie称作临时Cookie。
-
永久保存
cookie对象调用了setMaxAge可以设置cookie在浏览器中的存活的时间。单位是秒。
永久的cookie是存储在客户端硬盘上的。
Cookie存储数据的类型
cookie只能存储String类型的数据
哪些网址能够取到Cookie
- 哪个网址写入了cookie,就只能由哪个网址读回cookie。
- 也可以设置cookie的域。
cookie.setDomain("http://www.baidu.com")
cookie的路径
当一个项目中有两个数据都要用cookie存储时,这两个cookie的名称就要写不同,除非他们是在不同的项目中的。
如果有相同名称的cookie需要将cookie设置在不同的目录中。通过调用setPath()方法可以设置cookie的路径。
Cookie cookie1=new Cookie("data",老师);
cookie1.setPath("/mvc/teacher");
Cookie cookie2=new Cookie("date",学生);
cookie2.setPath("/mvc/student");
cookie存储汉字
如果cookie中如果存储了汉字,默认就会发生java.lang.IllegalArgumentException异常。
-
解决的办法 在储存之前将汉字编码,在读取之后再讲汉字进行解码。
编码:URLEncoder.encode()
解码:URLDecoder.decode()
cookie的失效
将cookie的最大存活时间设置成0,
cookie.setMaxAge(0)
cookie的安全性
cookie是不安全的,因为他保存在客户端。可以被看见之后修改。所以敏感的数据都不能保存到cookie中。
cookie的使用场景
http协议的特点
http是超文本传输协议,文本表示协议,超文本就是有格式的文本。格式表示可以设置文本的文字颜色,文字大小。
特点:是无状态的,无状态的是值协议本身不保存连接信息。每次访问时,http协议不会记录用户访问过的url。为了实现不同页面之间传递信息不依赖于http协议,因此web容器开发了在不同页面间传递信息的对象。具体的办法有
- cookie
- session
- application
- url传参
- 表单提交
session
session:是内置对象。是javax.servlet.HttpSession类的对象。
session的几个理解
- 会话:会话是一段时间,这段时间默认从打开浏览器开始到关闭浏览器为止。
- 一次会话可以包含多次请求与响应
- 会话的核心是共享数据
- session是私有的
在jsp页面中获取session
ession是内置对象,直接写就可以了。
在Servlet中获取session
request对象的getSession()方法可以获取session对象。
session中存储数据的类型
session的setAttribute方法能存储object类型的数据。
session存储数据的位置
session是在服务端存储数据。
session的安全性问题
由于session是存储在服务器内存中的,因此是安全的。
立刻销毁用户在session中存储的数据
调用session对象的invalidate()方法。
session在服务端默认的存储时间
30分钟。
更改seeion默认的储存时间
在web.xml中修改
<session-config>
<session-timeout>10</session-timeout>
</session-config>
向session中存储和获取对象
session.setAttribute(String,object)
object obj=session.getAttribute(key)
移除session中存储的数据
session.removeAttribute(key)
Include指令
jsp中指令有三种,分别是page,include,taglib
include:在所有需要登录后才能访问的页面中含入对登录验证的jsp文件就可以实现登录后访问.
<%include file="isLogin.jsp"%>
注意:被含入文件的源代码中不要抛出项目的变量名。否则会抛出错误。
application内置对象
applicaton是jsp的内置对象,对象名application,他是javax.servet.http.ServletContext接口的对象。在jsp页面中直接使用。
在servlet中用request.getSession.getServletContect().
用application,getRealPath("/")返回项目在硬盘上存储的url。
EL 和 JSTL
- 前端的输出内容都使用EL表达式来代替java代码。前端的基本逻辑使用JSTL来代替。
EL表达式
EL表达式,Express language,简称EL。是用来在前端页面输出内容的。相当于out.print().
- 只能将四个范围中的数据传输到界面上。
- 四个范围分别是pageContext,request,session,application.
- 取值的顺序是从小到大的。
语法格式
¥{express}
express可以是
- 算数运算
- 关系运算
- 逻辑运算
- 实体对象
JSTL
JSTL是java的标准标签库
用于代替界面上的java编程逻辑,比如代替if语句,switch语句,for语句,out内置对象,定义变量。
在使用前要导入JSTL的jar包,导入JSTL标签库。
核心标签
核心的标签库有
-
set标签
-
out标签 out标签与${}等价
-
remove标签
-
if标签
-
choose when otherwise标签
-
Foreach标签
格式化标签库
- FormatNumber标签
- formatDate标签
四大作用域
他们是共享数据的。分别是pageContext,request,session,application.
- page能够实现在同一个页面中的数据共享。
- request实现了一个请求在不同页面间共享数据。
- session实现了在同一个会话中共享数据。
- application实现了所有用户所有页面间共享数据。
- 都是通过调用setAttribute(k,v)来存储数据,用getAttribute(k)来获取数据。