1.Web应用和web.xml文件
构建web应用
- JSP(Java sever page)和Servlet是JavaEE规范的两个基本成员。
- JSP正慢慢发展成单一的表现层技术,不再承担业务逻辑组件及持久层组件的责任。
- Web应用的文件结构:
<WebDemo>-------Web应用的名称,可改变 |--WEB-INF-----区分大小写 | |--classes | |--lib | |--web.xml |--<a.jsp>------此处可任意放多个jsp页面
配置描述符web.xml
- WEB-INF是一个特殊的文件夹,Web容器会包含该文件夹下的内容,但客户端浏览器无法访问WEB-INF下的任何内容。
以下是eclipse默认生成的web.xml代码,用于配置Web应用的首页列表:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>practice</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
- 每个Web容器都会提供一个系统的web.xml文件,用于描述所有Web应用共同的配置属性。如Tomcat的系统web.xml放在Tomcat的conf路径下。
2.JSP的基本原理
- JSP的本质依然是Servlet(一个特殊的Java类),每个JSP页面就是一个Servlet实例----JSP页面由系统编译成Servlet,Servlet再负责响应用户请求。
- 对于Tomcat而言,JSP页面生成的Servlet放在work路径对应的Web应用下。
3.JSP的四种基本语法
JSP注释和声明
- JSP注释
<%-- 注释内容 --%>
- HTML注释
<!-- 注释内容 -->
- JSP声明
<%! 声明部分 %>
- JSP注释及声明示例
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP注释及声明</title>
</head>
<body>
<!--此处为html注释-->
<%--此处为jsp注释--%>
<%!
//声明一个整型变量
public int count;
public String info(){
return "hello World!";
}
%>
<%
out.println(count++);
%>
<br>
<%
out.println(info());
%>
</body>
运行并查看页面源代码:
发现没有显示JSP注释,这表明JSP注释不会被发送到客户端。
每刷新一次,count值将加1,甚至可以在不同的机器上打开浏览器来刷新该页面,将发现所有你客户端的count值是连续的,即所有客户端共享了同一个count变量,这是因为:JSP页面会编译成一个Servlet类,每个Servlet在容器中只有一个实例;在JSP中声明的变量是成员变量,成员变量只在创建实例时初始化,该变量的值将一直保存,直至实例销毁。
JSP声明中独立存在的方法只是一种假象,如info()。这是因为,JSP声明的方法其实是在JSP编译中生成的Servlet的实例方法----Java里的方法是不能独立存在的,JSP页面亦然。
JSP输出表达式
- 语法格式
<%= 表达式 %>
- 示例
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>输出表达式</title>
</head>
<body>
<%!
//声明一个整型变量
public int count;
public String info(){
return "hello World!";
}
%>
<!-- 使用表达式输出变量值 -->
<%=count++%>
<br>
<%=info()%>
</body>
</html>
上例使用<%= %>代替了原来的out.println()输出语句,注意count++和info()等表达式后不能加分号(如<%count++;%>)。
JSP脚本
- 语法格式:
<% JSP脚本 %>
- 示例
<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>jsp脚本</title> </head> <body> <% for(int i=0;i<=10;i++){ %> <%-- 此处为循环体 --%> <table border="1" width="200"> <td>循环值</td> <td width="50"><%=i %></td> </table> <% } %> </body> </html>
运行截图:
对应在Tomcat 9.0\work\Catalina\localhost\practice\org\apache\jsp路径下的JSPscript_jsp.java代码片段:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
.........
for(int i=0;i<=10;i++){
out.write('\r');
out.write('\n');
out.write("\r\n");
out.write("\t<table border=\"1\" width=\"200\">\r\n");
out.write("\t<td>循环值</td>\r\n");
out.write("\t<td width=\"50\">");
out.print(i );
out.write("</td>\r\n");
out.write("\t</table>\r\n");
}
........
由此可以看出,JSP脚本将转换成_ jspService方法里的可执行代码,故可以得出:
1.JSP脚本部分声明的变量是局部变量,且不能使用private、public等访问控制修饰符,也不可使用static修饰。
2.Java语法不允许在方法里定义方法,所以JSP脚本里不能定义方法。