JSP 学习记录

JSP 简介

全名为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java当中使用HTML标签。JSP是一种动态网页技术标准,也是JavaEE的标准,JSP与Servlet一样,是在服务器端执行的。
软件开发三大方向:

  1. 桌面应用程序
  2. Web应用程序
  3. 嵌入式应用程序(手机的APP)

一、Web 开发知识补充

1.1 静态网页 VS 动态网页

1.1.1 静态网页

  • 内容固定,不会更新
  • HTML,CSS

1.1.2 动态网页

  • 通过程序动态显示,自动更新
  • 所需技术:HTML,CSS,JS,XML,数据库库,一门高级语言(Java,C#,PHP)
  • 主流的动态网页脚本技术:JSP/Asp.net/php

1.2 搭建 Java Web

JDK , Tomcat, IDE
推荐:JDK1.7,Tomcat7.0,MyEclipse10

1.2.1 Tomcat 目录结构

目录 说明
/bin 存放各种平台下用于启动和停止Tomcat的命令文件
/conf 存放Tomcat服务器的各种配置文件
/lib 存放Tomcat服务器所需的各种JAR文件
/logs 存放Tomcat的日志文件
/temp Tomcat运行时用于存放临时文件
/webapps 当发布Web应用时
/work Tomcat把由JSP生成的Servlet放于此目录下

1.2.2 WEB-INF 目录结构

  1. WEB_INF:Java的Web应用的安全(客户端无法访问,只有服务端可以访问的)目录。
  2. web.xml 项目部署文件
  3. classes:放置*.class文件,放在WEB_INF目录下,IDEA需要手动建立
  4. lib文件夹:放置需要的jar包,放在WEB_INF目录下,IDEA需要手动建立

1.3 如何修改Tomcat的端口?

修改 Tomcat的conf/server.xml的:

    

修改Port就能成功修改Tomcat的默认端口

1.4 常见动态网站开发技术对比

  • JSP:Java平台,安全性高,适合开发大型的,企业级的Web应用程序
  • Asp.net:.Net平台,简单易学,但是安全性以及跨平台性差
  • PHP:简单,高效,成本低开发周期短,特别适合中小型企业的Web应用开发(LAMP:Linux+Apache+MySQL+PHP)
JSP 适合分布式的,Hadoop

二、JSP 基础语法

页面元素组成:

  1. 静态内容
  2. 指令
  3. 注释
  4. 脚本
  5. 声明
  6. 表达式

2.1 JSP指令

指令 说明
page 通常位于JSP页面的顶端,同一个页面可以有多个page指令
include 将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句
taglib 使用标签库定义新的自定义标签,在JSP页面中启用定制行为

2.1.1 page指令

语法:

<%@ page 属性1="属性值" 属性2="属性值1,属性值2"... 属性n="属性值n" %>
属性 描述 默认值
language 指定JSP页面使用的脚本语言 Java
import 通过该属性来引用脚本语言中使用到的类文件
contentType 用来指定JSP页面所采用的编码方式 text/html,ISO-8859-1

2.2 JSP 注释

HTML 注释

  //客户端可见,审查元素时

JSP的注释:

<%-- JSP 的注释 -- %> //客户端不可见

JSP 脚本注释:客户端不可见

// 单行注释
/* 多行注释
*/ 

2.3 JSP 脚本

语法:

<% Java代码 %>

2.4 JSP 声明

在JSP中定义变量或者方法

语法:

<%! Java代码%>

例子:

<%!
    String s = "张三";    //声明了一个字符串
    int add(int x, int y){   //声明了一个函数,返回两个整数的求和
        return x+y
    }
%>

2.5 JSP的表达式

JSP中执行的表达式
<%= 表达式%>  // 注意表达式不以分号结束

三、JSP 内置对象

3.1 内置对象简介

JSP内置对象是web容器创建的一组对象,不用new关键字就可以使用的内置对象

<%
    int[] value = {60,70,80}
    for(int i:value){
        out.println(i)
    }
%>

JSP内置对象:

  1. out
  2. request
  3. response
  4. session
  5. application
  6. Page/pageContext/exception/config

3.2 out

JspWriter类的实例,向客户端(浏览器)输出内容常用的对象
常用方法如下:

  1. void println()向客户端打印字符串
  2. void clear() 清除缓冲区的内容,如果在flush之后调用会抛出异常
  3. void clearBuffer() 清除缓冲区的内容,如果在flush之后调用不会抛出异常
  4. void flush() 将缓冲区内容输出到客户端
  5. int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
  6. int getRemaining() 返回缓冲区还剩余多少可用
  7. boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
  8. void close() 关闭输出流

3.3 request/response

客户端的请求信息被封装在Request对象中,通过它才能了解到客户的需求,然后做出响应。它是HttpServletRequest类的实例。request对象具有请求域,即完成客户端的请求之前,该对象一直有效。

3.3.1 补充:get 和 post区别

表单:

表单提交方式:get和post

get:以明文的方式通过URL提交数据数据在URL中可以看到。提交的数据量最多不超过2KB安全性较低但效率比post方式高。适合提交数据量不大,安全性不高的数据。比如:搜索、查询等功能。
例如结果如下:

 http://localhost:8080/ServletDemo/dologin.jsp?username=12&password=12

post:将用户提交的信息封装在HTML HEADER内。适合提交数据量大,安全性高的用户信息。比如:注册,修改,上传等功能

3.3.2 常用方法

1. String getParameter(String name) 返回name指定参数的参数值
2. String[] getParameterValues(String name)返回包含参数name的所有值的数据
    

request 内置对象

<% request.setCharacterEncoding("utf-8"); %> 用户名:<%=request.getParameter("username")%>
爱好:<% String[] favorites = request.getParameterValues("favorite"); for (int i = 0; i < favorites.length; i++) { out.println(favorites[i]+"  "); } %>
request.setCharacterEncoding("utf-8”);
避免中文在客户端显示乱码

通过URL提交表单,如果是中文可能还会乱码

解决方法:配置Tomcat
tomcat的conf目录下的 server.xml

需要重启Tomcat生效

3. void setAttribute(String, Object) 存储此请求中的属性
4. object getAttribute(String name) 返回指定属性的属性值

如我们在解析request时候,可以设置默认项(密码):

request.setAttribute("password", "123456");

然后读取这个值

密码:<%=request.getAttribute("password")%>
5. String getContentType() 得到请求体的MIME类型
6. String getProtocol() 返回请求用的协议类型及版本号
7. String getServerName() 返回接收请求的服务器主机名

3.3.3 其他方法:

1. int getServerPort() 返回服务器接收此请求所用的端口号
2. String getCharaterEncoding() 返回字符编码方式
3. void setCharacterEncoding() 设置请求的字符编码方式
4. int getContentLength() 返回请求体的长度(字节数)
5. String getRemoteAddr() 返回请求的客户端IP地址
6. String getRealPath(String path) 返回一虚拟路径的真是路径

3.4 response 对象

包含了响应客户端请求的有关信息,但是在JSP中很少使用到它。它是HttpServletResponse类的实例。response对象具有页面作用域,即访问一个页面时,该页面的response对象只能对这次访问有效,其他页面的response对象对当前页面无效

3.4.1 常用方法:

1. String getCharacterEncoding() 返回响应用的是何种字符编码
2. void setContentType(String type)设置响应的MIME类型
3. PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(注意比较PrintWriter与内置out对象的区别)

区别:

  1. out和response.getWriter的类不一样,一个是JspWriter,另一个是java.io.PrintWriter。
  2. 执行原理不同:JspWriter相当于一个带缓存功能的printWriter,它不是直接将数据输出到页面,而是将数据刷新到response的缓冲区后再输出,response.getWriter直接输出数据(response.print()),所以(out.print)只能在其后输出。 (如果想要out对象强制在前输出,可以out之后使用flush()方法)
  3. out为jsp的内置对象,刷新jsp页面,自动初始化获得out对象,所以使用out对象是需要刷新页面的,而response.getWriter()响应信息通过out对象输出到网页上,当响应结束时它自动被关闭,与jsp页面无关,无需刷新页面。「形象的比喻:当我们调用response.getWriter()这个对象同时获得了网页的画笔,这时你就可以通过这个画笔在网页上画任何你想要显示的东西。」
  4. out的print()方法和println()方法在缓冲区溢出并且没有自动刷新时候会产生ioexception,而response.getWrite()方法的print和println中都是抑制ioexception异常的,不会有ioexception 。
4. sendRedirect(java.lang.String location) 重定向客户端的请求

请求转发与请求重定向的区别:

  1. 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变
  2. 请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址栏的URL地址不会改变

例子:办理护照
       重定向:你先去了A局,A局的人说:“这事不归我们管,去B局”,然后你从A退了出来,乘车去了B局
       转发:你去了A局,A局看了以后,知道这个事情应该B局管,没有退出来,让你坐了一会,自己倒了后面办公室联系了B的人,让他们办好后,送了过来。

3.5 session

  • 表示客户端与服务器的一次会话
  • Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过这段时间,也就是用户浏览这个网站所花费的时间
  • 从上述定义可以看到,session实际上是一个特定的时间概念

3.5.1 什么是Session?

在服务器的内存中保存着不同用户的session,每一个用户一个session。

3.5.2 session 对象

  • JSP内置对象
  • 在第一个JSP页面被装载时自动创建,完成会话期管理
  • 从一个客户打开浏览器并连接到服务器开始,到客户端关闭浏览器离开这个服务器结束,被称为一个会话
  • 当客户访问一个服务器时,可能在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象
  • session对象是HTTPSession类的实例

3.5.3 常用方法:

1. long getCreationTime():返回Session创建时间
2. public String getID(): 返回session创建时JSP引擎为它设的唯一ID号
3. public Object setAttribute(String name, Object value):使用指定名称对象绑定此会话
4. public Object getAttribute(String name):返回此会话中的指定名称绑定在一起时的对象
如果没有对象绑定在该名称,返回Null
5. String[] getValueNames():返回一个包含此session中所有可用属性的数组
6. int getMaxInactiveInterval(): 返回两次请求间隔多长时间此session被取消(单位秒)

3.5.4 Session 生存周期

  1. 创建
  2. 活动
  3. 销毁
3.5.4.1 创建:

当客户端第一次访问某个JSP或者servlet时候,服务器会为当前会话创建一个sessionId,每次客户端向服务器发送请求时,都会将此SessionId携带过去,服务端会对此SessionId进行校验

3.5.4.2 活动:
  • 某次会话当中通过超链接打开的新页面属于同一次会话。
  • 只要当前会话页面没有全部关闭,重新打开的新浏览器窗口访问同一个项目资源时属于同一次会话。
  • 除非本次会话的所有页面都关闭后再重新访问某个JSP或者Servlet,将会创建新的会话。
注意事项:注意原有会话还存在,只是这个旧的sessionId仍存在服务端,只是再也没有客户端会携带它然后交于服务端校验
3.5.4.3 销毁:

session的销毁方式只有三种:

  1. 调用session.invalidate()方法
  2. session过期(超时)
  3. 服务器重启

设置超时时间两种方式:

  1. session.setMaxInactiveInterval(时间)时间是秒
  2. web.xml配置


    10 //分钟

3.6 application

  • 实现了用户间数据的共享,可存放全局变量
  • 开始于服务器的启动,终止于服务器的关闭
  • 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作
  • 在任何地方对application对象属性的操作,都将影响到其他用户对此的访问
  • 服务器的启动和关闭决定了application对象的声明
  • application对象是ServletContext类的实例

常用方法:

  • public void serAttribute(String name, Object value)使用指定名称将对象绑定到此会话
  • public Object getArrtibute(String name) 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在此名称下,则返回null
  • Enumeration getAttributeNames()返回所有可用属性名的枚举
  • String getServerInfo()返回JSP(Servlet)引擎名及版本号

3.7 page / pageContext / exception / config

3.7.1 page 对象

指当前JSP页面本身,有点像类中的this指针,它是Java.long.Object类的实例

常用方法(Object类的方法):

  • class getClass() 返回此Object 的类
  • int hashCode() 返回此Object的Hash码
  • boolean equals(Object obj) 判断此Object是否与指定的Object对象相等
  • void copy(Object obj)把此Object拷贝到指定的Object对象中
  • Object clone() 克隆此Object对象
  • String toString 把Object对象转换成String类的对象
  • void notify() 唤醒一个等待的线程
  • void notifyall() 唤醒所有等待的线程
  • void wait(int timeout)使一个线程处于等待直到timeout结束或者被唤醒
  • void wait() 使一个线程处于等待直到被唤醒

3.7.2 pageContext对象

  • 提供了对JSP页面内所有的对象及名字空间的访问
  • 可以访问到本页所在的session,也可以取本页面所在的application的某一个属性值
  • 相当于页面中所有功能的集大成者
  • 本类名也叫pageContext

常用方法:

  • JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
  • HttpSession getSession() 返回当前页中的HttpSession对象(session)
  • Object getPage() 返回当前页的Object对象(page)
  • ServletRequest getRequest() 返回当前页的ServletRequest对象(request)
  • ServletResponse getResponse() 返回当前页的ServletResponse对象(response)
  • void setAttribute(String name, Object attribute)设置属性及属性值
  • Object getAttribute(String name, int scope)在指定范围内取属性的值
  • int getAttributeScope(String name) 返回某个属性的作用范围
  • void forward(String relativeUrlPath) 使当前页面重导到另一页面
  • void include(String relativeUrlPath)在当前位置包含另一文件

3.7.3 Exception对象

异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设置为true,否则无法编译。它实际上是java.lang.Throwable的对象
常用方法:

  • String getMessage() 返回描述异常的消息
  • String toString() 返回关于异常的简短描述信息
  • void printStackTrace() 显示异常及其栈轨迹
  • Throwable FillInStackTrace() 重写异常的执行栈轨迹

需要处理异常的页面,页面头要加上errorPage

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="exception.jsp" %>

Exception页面要在page中填写isErrorPage

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

3.7.4 Config 对象

在Servlet初始化时,JSP引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServletContext对象)
常用方法如下:

  • ServletContext getServletContext() 返回含有服务器相关信息的 ServletContext 对象
  • String getInitParameter(String name)返回初始化参数的值
  • Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举

四、JavaBean

4.1 JavaBean 简介

就是符合某种特定的规范的Java类。使用Javabeans的好处是解决代码重复编写,减少代码冗余,功能区分明确,提高了代码的维护性。

4.2 JavaBean的设计原则

  1. 公有类
  2. 无参的公有构造方法
  3. 属性私有
  4. getter和setter方法

Javabean 设计原则举例

//设计学生类
public class Students // 公有类
{
    private String name; //属性私有
    private int age; //属性私有
    public Students() //无参的公有构造方法
    {}
    // getter 和 setter 方法
    public void setName(String name){this.name =name;}
    public String getName(){return this.name}
    public void setAge(int age){this.age = age;}
    public int getAge(){return this.age;}
}

什么是Jsp动作

JSP动作元素(acion elements)为请求处理阶段提供信息。动作元素遵循XML元素的语法,有一个包含元素名的开始标签,可以有属性、可选内容、与开始标签匹配的结束标签。

第一类:存取与JavaBean有关「重要」
第二类:JSP1.2开始有的基本元素,包含6个动作元素
第三类:JSP2.0新增加的元素,主要与JSP Document有关,包含6个元素
第四类:JSP2.0新增加的动作元素,主要是用来动态生成XML元素标签的值,包括3个动作
第五类:JSP2.0 新增加的动作元素,主要使用在Tag File中,有2个元素

4.3 如何在JSP页面中使用Javabeans?

4.3.1 像使用普通类一样创建Javabeans实例

  
    <%
        Users user = new Users();
        user.setUsername("admin");//设置用户名
        user.setPassword("123456");  //设置密码
    %>
    

使用普通方式创建javabean实例


用户名:<%=user.getUsername()%>
密码:<%=user.getPassword()%>

4.3.2 JSP页面中通常使用动作标签使用javabean

useBeans动作 setProperty动作 getProperty动作


作用:在jsp页面中实例化或者在指定范围内使用javabean:

    
    

使用useBean动作创建javabean实例


用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%>

作用:给已经实例化的JavaBean对象的属性复制,一共有四种形式
(与表单关联)
(与表单关联)
(手工设置)
(与request参数关联)

    
    

setProperty动作元素


<%-- --%> <%-- --%> <%-- --%> 用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%>
第四种:form提交的action中设置了mypass参数

作用:获取指定JavaBean对象的属性值


用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%>
用户名:
密码:
JavaBean的四个作用域范围

说明:使用useBeans 的scope属性可以用来指定JavaBean的作用范围

  • page //当前页面有效
  • request //可以通过HttpRequest.getAttribute()方法获取JavaBean对象
  • session //可以通过HttpSession.getAttribute()方法获取JavaBean对象
  • application // 可以通过application.getAttribute() 方法获取JavaBean对象
作用域 描述
存储在application对象中的属性 可以被同一个WEB应用程序中的所有Servlet和JSP页面访问
存储在session对象中的属性 可以被属于同一个会话(浏览器打开直到关闭称为一次会话,且在此期间会话不失效)的所有Servlet和JSP页面访问
存储在request对象中的属性 可以被属于同一个请求的所有Servlet和JSP页面访问(在有转发的情况下可以跨页面获取属性值),例如使用PageContext.forward和PageContext.include方法连接起来的多个Servlet和JSP页面
存储在pageContext对象中的属性 仅可以被当前JSP页面的当前响应过程中调用的各个组件访问,例如,正在响应当前请求的JSP页面和它调用的各个自定义标签类
    

JavaBean四个作用域范围


用户名:
密码:
<%-- 用户名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword()%>>
--%> <%-- 用户名:<%=((Users)application.getAttribute("myUsers")).getUsername()%>>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword()%>>
--%> 用户名:<%=((Users)request.getAttribute("myUsers")).getUsername()%>>
密码:<%=((Users)request.getAttribute("myUsers")).getPassword()%>>
request 通过请求转发还可以获取到,但是page在其他页面无法获取到

Model1 简介

Model 1模型出现前,整个Web应用的情况:几乎全部由JSP页面组成,JSP页面接收处理客户端请求,对请求处理后直接作出响应。
弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可扩展性可维护性非常差。

JavaBean的出现可以使JSP页面中使用JavaBean封装的数据或者调用JavaBean的业务逻辑代码,这样大大提升了程序的可维护性

Model1简单来说就是JSP+JavaBean的开发模式

五、JSP 状态管理

5.1 HTTP协议无状态性

无状态:浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个服务器。

简单地说,就是服务器不会记录你,就是无状态协议

5.2 保存用户状态的两大机制(session&cookie)

cookie

中文名:“小甜饼”
Web服务器保存在客户端的一系列文本信息
典型应用一:判定注册用户是否已经登录网址 (如十天内免登录…)
典型应用二:“购物车的处理”

Cookie的作用
  • 对特定对象的追踪
  • 保存用户网页浏览记录与习惯
  • 简化登录
安全风险:容易泄漏用户信息
JSP中创建与使用Cookies

创建Cookie对象:

Cookie newCookie = new Cookie(String key, Object value);

写入Cookie对象:

response.addCookie(newCookie)

读取Cookie对象:

Cookie[] cookies = request.getCookies();

Cookie常用方法:

方法名称 说明
void setMaxAge(int expiry) 设置cookie的有效期,以秒为单位
void setValue(String value) 在cookie 创建后,对cookie进行赋值
String getName() 获取cookie名称
String getValue() 获取cookie的值
int getMaxAge() 获取cookie的有效时间,以秒为单位
session 和cookie对比
session cookie
服务器端(内存)保存用户信息 客户端(文本文件)保存用户信息
session中保存的是Object类型 cookie 保存的是String类型
随会话的结束而将其存储的数据销毁 cookie可以长期保存在客户端
保存重要的信息 保存不重要的用户信息
安全性 :session 比 cookie要高

六、指令与动作

6.1 include指令

语法:
<%@ include file=“URL”%>

6.2 include动作

语法:

常用page和flush:
page:要包含的页面
flush: 被包含的页面是否从缓冲区读取

6.3 include指令和include动作的区别

include 指令 jsp:include 动作
语法格式 <%@ include file= “…” %>
发生作用的时间 页面转换期间 请求期间
包含的内容 文件的实际内容(代码) 页面的输出(结果)
转换成的Servlet 主页面和包含页面转换成一个Servlet 主页面和包含页面转换为独立的Servlet
编译时间 较慢——资源必须被解析 较快
执行时间 稍快 较慢——每次资源必须被解析

6.4 动作

语法:

等同:
request.getRequestDispatcher(“/url”).forward(request, response);

6.5

语法:

常常作为的子标签
案例:

  
    
     //修改密码

七、知识点补充

7.1 JSP对象 怎样获得

JSP 对象 怎么获得
out resp.getWriter
request servlet 方法的 req参数
response servlet 方法的 resp参数
session req.getSession() 函数
application getServletContext() 函数
exception Throwable
page this
pageContext PageContext
config getServletConfig()

你可能感兴趣的:(jsp,java,servlet,idea)