JSP全称为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java中使用html标签。JSP是一种动态网页技术标准,也是JavaEE的标准。JSP同Servlet一样,是在服务器端执行的

三种开发技术对比

Jsp Asp.net PHP
基于Java平台,安全性高,跨平台型好,维护量大,适合大型企业 简单易学,但安全性与跨平台性差 简单高效,成本低,尤其适合中小型企业的Web应用开发

对于PHP有一个黄金组合,LAMP(Linux+Apache+MySQL+PHP)

JSP页面元素构成

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

指令

  1. page指令:位于页面顶端,同一个页面可以有多个page指令
  2. include指令:将一个外部文件嵌入到当前的JSP文件中,同时解析这个页面中的JSP语句
  3. taglib指令:使用其定义新的自定义标签,并在JSP页面中启用这些定制的标签

page指令

语法格式:

<%@ page 属性1="属性值" 属性2="属性值1, 属性值2" 属性n="属性值n" %>
常用属性 描述 默认值
language 指定JSP页面使用的脚本语言 java
import 通过该属性引用脚本语言中使用到的类文件
contentType 用来指定JSP页面所采用的编码方式 text/html; ISO-8859-1
推荐将contenType的值改为:text/html; charset=UTF-8

注释

在JSP中可以使用三种格式的注释

  • html注释
<!--html注释-->这种注释在客户端是可见的,即可以通过查看页面源码(F12)的方式看到
  • JSP注释
<%--JSP注释--%>这种注释在客户端不可见
  • JSP脚本注释(注意还是需要<%%>包围)
<%//单行注释%>
<%/*多行
注释*/%>这种在客户端不可见

小脚本

本身就是可以在JSP页面中执行的java代码
语法:<% Java代码 %>

需要注意:在JSP中System.out.println()是在java控制台输出,而想要在页面输出,必须使用out.println()
如果在这一步中出现对out.println()的编译报错,可能是没有引入tomcat的jar包

声明

声明就是在JSP页面中定义变量或者方法
语法:<%! Java代码 %>
例如:

<%!
    String s = "haha";
    int add(int x, int y){
        return x+y;
    }
%>

表达式

在JSP页面中执行的表达式
语法:<%=表达式 %>

注意:表达式不以分号为结束,而且第一个%号与=号之间不能有空格

JSP页面的生命周期

u=2442718007,3441868090&fm=27&gp=0.jpg
jspService()方法用来处理客户端的请求。对于每一个请求,JSP引擎创建一个新的线程来处理该请求,如果有多个客户端同时请求该JSP文件,则JSP引擎会创建多个线程。每个客户端请求对应一个线程。以多线程方式执行可以大大降低对系统的资源需求,提高系统的并发量和响应时间,但也要注意多线程带来的同步问题,由于该Servlet始终驻留在内存,所以响应是非常快的。

jspService()和jspInit()方法可以在tomcat的work目录中,找到对应的工程进行查看

JSP内置对象

JSP内置对象是Web容器所创建的一组对象,不使用new关键字就可以使用的对象。
常用内置对象有:

  1. out
  2. request
  3. response
  4. session
  5. application

out对象

方法名 含义
void println() 向客户端打印字符串
void flush() 将缓冲区的内容输出到客户端
void clear() 清除缓冲区内容,如果在flush()之后调用会抛出异常
void close() 关闭输出流
void clearBuffer() 清除缓冲区内容,在flush()之后调用不会抛出异常
int getBefferSize() 返回缓冲区的字节数大小,如不设置缓冲区则返回0
int getRemaining() 返回缓冲区还剩余多少可用
boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常

request对象

它是HttpServletRequst类的实例。客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求并作出响应。

response对象

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

尽管response对象比较重要,但实际在JSP中,很少直接去使用它
值得注意的是:
<p>这是一个相应页面</p>
<%
    out.println("out生成的页面");
    PrintWriter outer = response.getWriter();
    outer.println("outer新生成的对象");
%>

执行后的页面结果为:

outer新生成的对象
这是一个相应页面
out生成的页面

也就是是,通过response.getWriter()方法获得的PrintWriter对象会显示在正常的页面流的前面。为了解决这种问题,可以通过out.flush()将outer对象前面的部分进行强制输出

session对象

是HttpSession类的实例。session对象在第一个JSP页面被装载时自动创建,完成会话期管理

session生命周期

  1. 创建:当客户端第一次访问某个jsp或者Servelet时,服务器会为当前会话创建一个SessionId,每次客户端向服务器发送请求时,都会将这个SessionId携带过去,服务器会对它进行校验
  2. 活动

    • 某次会话当中通过超链接打开的新页面属于同一次会话
    • 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话
    • 除非本次会话的所有页面都关闭(主动关闭或超时关闭),重新访问某个jsp或者Servelet将会创建新的会话
    • 注意原有会话还存在,即这个旧的SessionId仍然存在于服务器中,只不过再也没有客户端会携带它然后交予服务器进行校验
  3. 销毁:有三种方式

    • 调用session.invalidate()方法
    • Session过期(超时)
    • 服务器重新启动

application对象

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

JavaBeans

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

附录

get与post

表单常见的两种方式有get和post

  1. get:以明文的方式通过URL提交数据,数据在URL中可见,提交的数据最多不超过2KB。其安全性较低,但是效率比POST要高,适合提交数据量不大,安全性不高的数据,例如搜索、查询等功能
  2. post:将用户提交的数据封装在HTML Header中。适合提交数据量大,安全性高的用户信息。比如注册、修改等功能

请求重定向与请求转发

- - 代码示例 说明
请求重定向 客户端行为 response.sendRedirect() 本质上相当于两次请求,前一次请求对象不会保存,地址栏的URL会改变
请求转发 服务器行为 request.getRequestDispatcher().forward(req,resp) 只是一次请求,转发后请求对象会保存,地址栏的URL不会改变

session

session表示客户端与服务器的一次会话,其存在的时间是从进入网站到浏览器关闭这段时间
session会保存在服务器内存中,而且用户与session一一对应,不同的用户对应的session不同。当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象

从一个客户打开浏览器并连接服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
有些页面也设置有过期时间,一旦长时间离开页面,会话也可能被关闭

简_矩_风
5 声望1 粉丝