WEB项目的目录结构
META-INT WEB-INF 对外都是不可访问的,不可把index.jsp/index.html 放这
JSP
JSP是为了简化Servlet的工作出现的替代品,Servlet输出HTML非常困难,JSP就是替代Servlet输出HTML的。
JSP本身就是一种Servlet。其实JSP文件在第一次被访问的时候会被编译为HttpJspPage类(该类是HttpServlet的一个子类)
编译过程:
浏览器第一次请求1.jsp时,Tomcat会将1.jsp转化成1_jsp.java这么一个类,并将该文件编译成class文件。编译完毕后再运行class文件来响应浏览器的请求。
以后访问1.jsp就不再重新编译jsp文件了,直接调用class文件来响应浏览器。当然了,如果Tomcat检测到JSP页面改动了的话,会重新编译的。
既然JSP是一个Servlet,那JSP页面中的HTML排版标签是怎么样被发送到浏览器的?我们来看下上面1_jsp.java的源码就知道了。原来就是用write()出去的罢了。说到底,JSP就是封装了Servlet的java程序罢了
out.write("\r\n");
out.write("
\r\n");out.write("
简单使用JSP\r\n");out.write("\r\n");
out.write("
\r\n");相对比Servlet内置了9个对象————out、session、response、request、config、page、application、pageContext、exception
一个 JSP 页面可由5种元素组合而成:
(1)普通的 HTML标签。
(2)JSP 标签:如,指令标签、动作标签。
(3)变量和方法的声明。
(4)Java 程序片。
(5)Java 表达式。
3,4,5 构成 JSP 的脚本部分,也叫做scriptlet。
JSP的脚本必须使用下面三种方式括起来!
【定义局部变量,编写语句】这里面声明的变量只在该内有效。
可以在“”之间插入 Java 程序片。一个 JSP 页面可以有许多程序片,这些程序片将被 JSP 引擎按顺序执行。在一个程序片中声明的变量称做 JSP 页面的局部变量。它们在 JSP 页面内的所有程序片部分以及表达式部分内都有效。这是因为 JSP 引擎将 JSP 页面转译成 Java 文件时,将各个程序片的这些变量作为某个方法的变量,即局部变量。
当程序片被调用执行时,这些变量被分配内存空间,所有的程序片调用完毕,这些变量即可释放所占的内存。当多个客户请求一个 JSP 页面时,JSP 引擎为每个客户启动一个线程,一个客户的局部变量和另一个客户的局部变量被分配不同的内存空间。因此,一个客户对 JSP 页面局部变量操作的结果,不会影响到其它客户的这个局部变量。
【定义类或方法或数据声明部分】这里面声明的数据在整个JSP 页面内有效。
原因:因为 JSP 引擎将 JSP页面转译成 Java 文件时,将这些变量作为类的成员变量。这些变量的内存空间直到服务器关闭才释放。当多个客户(浏览器)请求一个 JSP 页面时,JSP 引擎为每个客户启动一个线程,这些线程由 JSP 引擎服务器来管理,这些线程共享 JSP 页面的成员变量,因此任何一个用户对 JSP 页面成员变量操作的结果,都会影响到其他用户。
“”之间如果声明一个类,那么该类在 JSP 页面内有效,即在 JSP 页面的 Java 程序片部分可以使用该类创建对象。
(也称之为表达式输出)【输出各种类型的变量,int、double、String、Object等】
可以在“”之间插入一个表达式(注意:不可插入语句,“
如果过多地使用会导致代码混乱,JSP还提供了一种scriptlet标签,使用此标签和有相同的功能,只不过它更美观了一些
String s= "HelloWorld";
out.println(s);
配置JSP运行环境 :
在使用jsp之前要配置jsp引擎,我们使用tomcat服务器作为jsp引擎。
JSP 中的注释可分为两种
(1) HTML 注释:在标记符号“”之间加入注释内容:
客户通过浏览器查看 JSP 的源文件时,能够看到 HTML 注释。
(2) JSP 注释:在标记符号“ ”之间加入注释内容:
JSP 引擎忽略 JSP 注释,即在编译 JSP 页面时忽略 JSP 注释。
输出当前日期new SimpleDateFormat("yyyy年 MM月dd日");
String strCurrentTime= formater.format(new Date()); %>
JSP中的 PAGE指令
通过设置内部的多个属性定义整个页面的属性
PAGE指令:
page 指令的作用对整个页面有效,与其书写的位置无关,但习惯把page指令写在JSP页面的最前面。
Page设置的属性只在当前页面有效,跳转页面属性就无效了
contentType属性 :
contentType="text/html:以text/html形式显示jsp的数据。
在page指令中指定contentType="text/html;charset=UTF-8",就不会出现中文乱码问题!
language属性:
该属性的值目前只能取"java"。如果没有指定该属性值的话,那么JSP会默认填上.
import属性:
该属性的作用是为 JSP 页面引入Java核心包中的类,这样就可以在JSP页面的程序
片部分、变量及函数声明部分、表达式部分使用包中的类。
JSP 页面默认import属性已经有如下的值:" java.lang.*"、"javax.servlet.*"、"javax.servlet.jsp.*"、"javax.servlet.http.*"。
如果为一个属性指定几个值话,这些值用逗号分割。page 指令只能给import属性指
定多个值;其它属性只能指定一个值。
例如:
当你为 import 指定多个属性值时,JSP引擎把JSP页面转译成的java文件中会有如
下的 import 语句:
import java.util.*;
import java.io.*;
import java.awt.*;
session 属性:
用于设置是否需要使用内置的session对象。
session 的属性值可以是true或false,session属性默认的属性值是true。
错误页面:
errorPage和isErrorPage
1.jsp出现了错误,通过page指令的errorPage属性跳转到error.jsp页面
int result = 2 / 0;%>
2.通过page指令的isErrorPage属性设置的页面就是错误页面
友好提示页面很多错误的jsp文件:
可以在web.xml文件中全局设置错误页,只要发生了404错误或者空指针异常的错误都会跳转到error.jsp页面上
404
/error.jsp
java.lang.NullPointerException
/error.jsp
JSP中的声明
实例1:输出今天时间
SimpleDateFormat formater= new SimpleDateFormat("yyyy年MM月dd日");returnformater.format(d);
}%>你好,今天是
实例2:计算从xxxx年到yyyy年的闰年个数
int findYear(int x,inty){int count = 0;for(int i = x;i<= y;i++){
System.out.print(i);//输出到控制台
if(i % 4 == 0){
count++;
}
}return count; //页面显示的是返回值所在的JSP表达式
}%>
个数是:
个数是:4
java代码中的System.out.print(); 输出到控制台
遇到的问题:
1.端口占用问题: 在eclipse中在server上运行项目时,需要将PC的tomcat服务器关闭 ————cmd中,shutdown.bat 【开启是:startup.bat】
2.
3.web.xml 配置文件