孙肖宁 发布的文章

jsp概述及原理

JSP全称是Java Server Pages,中文名叫java服务器页面,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。可以理解为:jsp = html + java

注意:

  • servlet:服务器端的小应用程序。主要功能为:获取表单数据、处理业务逻辑、分发转向。
  • jsp:适合编写输出动态内容,但不适合编写java逻辑。

jsp的原理:jsp文件翻译称为.java文件;.java文件编译生成.class文件。

jsp的基本语法

JSP的脚本
小脚本 <% java代码 %>
表达式 <%= 表达式 %> 等价于out.print(表达式);
声明
<%!declaration; [ declaration; ]+ ... %> 表示在类中定义全局成员,和静态块。
JSP注释
JSP注释:<%-- 被注释的内容 --%> 特点:网页源代码中不可见。安全,省流量
网页注释: 特点:网页源代码中可见。不安全,费流量

jsp的3个指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。

page指令
语法:
<%@ 指令名称 属性1="属性值1" 属性2="属性值2"...%>
或者:
<%@ 指令名称 属性1="属性值1"%>
<%@ 指令名称 属性2="属性值2"%>
如:解决中文乱码:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

作用:用于定义JSP页面的各种属性
属性:(基本上使用默认的就行)

  • import 和java代码中的import是一样的
    比如:

    <%@ page import="java.util.Date,java.util.List"%>

    JSP会自动导入以下的包:

    import java.lang.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.jsp.*;
  • session: 是否会自动创建session对象。默认值是true。
  • buffer: JSP中有javax.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小,默认是8kb。
  • errorPage: 如果页面中有错误,则跳转到指定的资源。
    errorPage="/uri" 如果写“/”则代表当前应用的目录下,绝对路径。如果不写“/”则代表相对路径。
  • isErrorPage: 是否创建throwable对象。默认是false。
  • contextType: 等同于response.setContextType("text/html;charset=utf-8")。
  • pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
  • isELIgnored: 是否支持EL表达式。 默认是false

include指令
静态包含:把其它资源包含到当前页面中。
<%@ include file="..." %>
动态包含:
<jsp:include page="..."></jsp:include>

两者的区别:
翻译的时间段不同
静态包含:在翻译时就把两个文件合并
动态包含:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

原则:能用静态包含就不用动态包含。

taglib指令
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

jsp的6个动作

  • jsp:include 在页面被请求的时候引入一个文件。
  • jsp:useBean 寻找或者实例化一个JavaBean。
  • jsp:setProperty 设置JavaBean的属性。
  • jsp:getProperty 输出某个JavaBean的属性。
  • jsp:forward 把请求转到一个新的页面。
  • jsp:plugin 根据浏览器类型为Java插件生成OBJECT或EMBED标记。
  • jsp:element 定义动态XML元素
  • jsp:attribute 设置动态定义的XML元素属性。
  • jsp:body 设置动态定义的XML元素内容。
  • jsp:text 在JSP页面和文档中使用写入文本的模板。

JSP 隐式对象

JSP隐式对象是JSP容器为每个页面提供的Java对象,开发者可以直接使用它们而不用显式声明。JSP隐式对象也被称为预定义变量。及:指在JSP的<%=%> 和<% %>中可以直接使用的对象。

  • request HttpServletRequest类的实例。
  • response HttpServletResponse类的实例。
  • out JspWriter类的实例,用于把结果输出至网页上。
  • session HttpSession类的实例。
  • application ServletContext类的实例,与应用上下文有关。
  • config ServletConfig类的实例。
  • pageContext PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问。本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
  • page 类似于Java类中的this关键字。
  • Exception Exception类的对象,代表发生错误的JSP页面中对应的异常对象。
    附:四大域对象
  • PageContext : pageConext 存放的数据在当前页面有效,开发时使用较少。
  • ServletRequest: request 存放的数据在一次请求(转发)内有效。
  • HttpSession: session 存放的数据在一次会话中有效。使用的比较多。
  • ServletContext: application 存放的数据在整个应用范围内都有效,因为范围太大,应尽量少用。

第一步:创建本地仓库
1.点击VCS选择Import into Version Control,然后选择Create Git Repository...
20180211125215.png-->
2.在弹框中选中项目所在的位置,点击OK
20180211125301.png
第二步:上传项目到本地仓库
1.点击VCS,选择Git,点击Add
20180211125524.png
2.点击VCS,选择Git,点击Commit File
20180211132625.png
3.填入本次提交的注释,点击Commit
20180211132716.png
4.继续点击Commit
20180211132735.png
第三步:上传项目到GitHub
1.点击VCS选择Import into Version Control,点击Share Project on GitHub
20180211132804.png
2.在弹框中输入仓库名和描述,点击Share
20180211133253.png
上传,第一次使用会弹窗输入GitHub的用户名和密码(已输入过用户名和密码并记住的不会再次弹框输入),上传成功后Idea右下角会给出提示。
第四步:提交修改的代码
1.点击VCS,选择Git,点击Add
20180211125524.png
2.点击VCS,选择Git,点击Commit File
20180211132625.png
3.填入本次提交的注释,点击Commit
20180211132716.png
4.继续点击Commit
20180211132735.png
5.点击点击VCS,选择Git,点击pull
20180211134708.png
6.点击pull
20180211134807.png
上传成功后Idea右下角会给出提示。

配置前提:
1.本地安装好Idea;
2.本地安装好git,并配置好,详情见:git的配置
3.有github账号
第一步:打开idea,选择File然后选择Setting
20180211115431.png
第二步:点击Version Control选择Git选择Path to Git executable(git的安装路径,一般可以自动选择)
20180211115511.png
点击Test,如果出现以下画面,则表示成功。
20180211115616.png
第三步:点击File选择Setting,再选择Version Control下的GibHub
host默认写github.com(如果自己搭建了,可以填写自己的)
点击Create API Token
20180211115741.png
第四步:填入在github中注册的用户名和密码,点击Login,自动生成token
点击Test,出现以下画面,则配置成功
20180211115937.png

会话概念

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。简单的说就是,用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

Cookie

概念
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。由于cookie是由客户端浏览器保存和携带的,所以称之为客户端技术。
常用方法:

  • public Cookie(String name,String value)构造方法,传入cooke名称和cookie的值。
  • public int getMaxAge()返回该cookie的最长存活时间,以毫秒计。默认为-1,表明该cookie将persist(存留)直到浏览器关闭。
  • public String getName()取得Cookie的名字,名称不能唯一确定一个Cookie,因为路径可能不同。
  • public String getPath()返回浏览器返回该cookie到服务器的路径。cookie对于服务器上所有的子路径都是可见的。
  • public String getValue()取得Cookie的值。
  • public void setMaxAge(int expiry)设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时。默认是-1(默认存在浏览器的内存中)单位是秒。负数:cookie的数据存在浏览器缓存中;0:删除。路径要保持一致,否则可能删错;正数:缓存(持久化到磁盘上)的时间。
  • public void setPath(String uri)设置浏览器返回该cookie的路径;默认值是写Cookie的那个程序的访问路径。不能存中文。
  • public void setValue(String newValue)设置Cookie的值。

注意:

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
  • 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
  • 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
  • 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
  • 删除cookie时,path必须一致,否则不会删除。

Session

概念:
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

常用方法:

  • request.getSession()获取Session对象,如果不存在就直接创建。
  • request.getSession(boolean create)获取Session对象,如果不存在就返回false。
  • getId()获取SessionId。
  • getCreationTime()获取当前session对象的创建时间。
  • getLastAccessedTime()获取最后一次访问该session对象的时间。
  • setMaxInactiveInterval()设置Session最大时效
  • getMaxInactiveInterval() 获取Session最大时效
  • invalidate()销毁当前Session对象
  • setAttribute()设置session属性
  • getAttribute()获得session属性
  • removeAttribute()移除session属性
  • getAttributeNames()

session实现会话过程数据共享的原理
Session是基于Cookie的、服务器创建每个session的时候,会为每个session分配一个ID号,即 JSESSIONID,服务器会以cookie的方式把session 的id号写给浏览器、所以session是基于cookie的。当浏览器再次访问的时候,会带着session id号的cookie过来 ,这就是session实现共享的原理。服务器写这个cookie的时候,是没有写有效期的,所以当浏览器关闭的时候,cookie也就没了,session也就结束了,即会话过程。

客户端禁用Cookie后的会话数据保存问题
客户端禁用cookie:浏览器永远不会向服务器发送cookie的请求消息头
解决方案:
方案一:在主页上给出提示,提示用户cookie异常。
方案二:URL重写。必须对网站的所有地址都重写。不以cookie的方式把JSESSIONID带给服务器,而是把JSESSIONID以url的方式带到服务器,即:URL重写,URL重写解决了禁用cookie后,Session的共享问题。
response.encodeURL(String url);该方法可以识别浏览器有没有发送cookie请求消息头,没有就重写URL,有就不重写。
前提request.getSession()必须写。

第一步:点击run;选择Edit Configurations
20180210134419.png
第二步:点击+;找到Tomcat Server;如果是本地的Tomcat就选择Local
20180210134518.png
第三步:1.填入TomCat的名字;2.选择TomCat的安装位置;3.选择默认浏览器
20180210141331.png
第四步:选择Deployment,然后点击Fix
20180210141424.png
第五步:点击右边的铅笔
20180210141442.png
第六步:点击文件夹,输入文件夹的名称
20180210141522.png
20180210141544.png
第七部:点击OK,点击Apply即可。

背景

背景颜色

属性:background-color
值:参考颜色的表示方式

背景图片

属性:background-image
值:url();url里跟的是图片的地址。

背景平铺

属性:background-repeat
值:repeat(默认)表示平铺这个标签;no-repea表示不平铺;repeat-x表示沿x轴平铺;repeat-y表示沿y轴平铺。

背景定位

属性:background-position
值:left表示水平方向的左;right表示水平方向的右;center表示中间;top表示垂直方向的上;bottom表示垂直方向的下。
注意:

  • 当方位属性的值只写一个的时候,另外一个值默认居中。
  • 如果写2个方位值,顺序没有要求。
  • 如果写的是2个具体值的时候,第一个值代表距离左侧的距离,第二个值代表距离顶部的距离。

    固定背景

    属性:background-attachment
    值:

  • scroll表示背景在页面的位置不固定,在页面的位置随内容改变而改变。
  • fixed表示背景在页面的位置固定,在页面的位置不会随内容改变而改变。相当于在浏览器页面内进行了定位。

附录:背景属性的连写
background:background-color background-image background-repeat background-position background-attachment;
注意:

  • background后面只写属性的值;
  • background-image的url是必写项,顺序无要求。

    行高

    行高:是基线与基线之间的距离
    行高=文字高度+上下边距
    注意:一行文字行高和父元素高度一致的时候,垂直居中显示。
    行高的计算
    单位除了像素以为,行高都是与文字大小乘积。
    在继承的时候,不带单位时,行高等于行高乘以子元素文字大小,em和%的行高等于和行高乘以父元素文字大小相乘。行高以像素为单位,就是定义的行高值。
    推荐行高使用像素为单位。行高也可以撑开盒子。不设置行高,默认是盒子的高度
    行内元素父元素给了行高之后,子盒子不能使用font,要单独设置字体样式,行内元素尽量不适用font。

超链接标签的CSS伪类

  • a:link{属性:值;} 链接默认状态,也可以表示为a{属性:值}
  • a:hover{属性:值;} 鼠标放到链接上显示的状态。
  • a:active{属性:值;}链接激活(鼠标点击时)的状态。
  • a:visited{属性:值;}链接访问之后的状态。
  • :focus{属性:值;}获取焦点
    注意:四种状态都写的时候,必须按顺序写,否则会出现错误。

    附录一:去除链接下划线

    属性:text-decoration
    值: none有下划线(默认); underline无下划线;line-through无下划线,有删除线

    附录二:鼠标放在链接时的鼠标的形状

    属性:cursor
    值:

  • url:需使用的自定义光标的 URL。注意:请在此列表的末端始终定义一种普通的光标,以防没有由 URL 定义的可用光标。
  • default:默认光标(通常是一个箭头)。
  • auto:浏览器设置的光标(一般标签默认)。
  • crosshair:光标呈现为十字线。
  • pointer:光标呈现为指示链接的指针(一只手)。
  • move:此光标指示某对象可被移动。
  • e-resize:此光标指示矩形框的边缘可被向右(东)移动。
  • ne-resize:此光标指示矩形框的边缘可被向上及向右移动(北/东)。
  • nw-resize:此光标指示矩形框的边缘可被向上及向左移动(北/西)。
  • n-resize:此光标指示矩形框的边缘可被向上(北)移动。
  • se-resize:此光标指示矩形框的边缘可被向下及向右移动(南/东)。
  • sw-resize:此光标指示矩形框的边缘可被向下及向左移动(南/西)。
  • s-resize:此光标指示矩形框的边缘可被向下移动(南)。
  • w-resize:此光标指示矩形框的边缘可被向左移动(西)。
  • text:此光标指示文本。
  • wait:此光标指示程序正忙(通常是一只表或沙漏)。
  • help:此光标指示可用的帮助(通常是一个问号或一个气球)。

继承性

前提:继承性发生的前提是包含(嵌套关系)
作用:子元素可以继承父元素的样式
注意:

  • 文字的所有属性都可以继承。
  • 标题(h1~h6)不能继承文字的大小
  • 超链接(a)标签不能继承文字颜色

    层叠性

    注意:当多个样式作用于同一个(同一类)标签时,样式发生了冲突,总是执行样式表后边的代码(浏览器的执行顺序是从上向下的,所以和标签调用选择器的顺序没有关系)。

    优先级

    !important>行内样式>id选择器>类选择器>标签选择器>通配符>继承>默认样式
    权重参考表(只作为参考,无实际意义)

    内联样式ID类,伪类和属性选择器类型选择器和伪元素选择器通配符、子选择器、相邻选择器
    10001001010

    注意:

  • !important1000以上
  • 继承的权重为0
  • 权重会叠加