第一章 JSP基础
1.1.URL(统一资源定位符)
1.1.1 组成
语法: 协议://ip地址:端口号/项目资源地址.
例: http://localhost:8080/news/index.html
1.2.Tomcat的目录结构
- bin //存放各种平台下用于启动和停止Tomcat的脚本文件
- conf //存放Tomcat服务器的各种配置文件
- lib //存放Tomcat服务器所需的各种JAR文件
- logs //存放Tomcat的日志文件
- temp //Tomcat运行时用于存放临时文件
- webapps //当发布Web应用时,默认情况下会将Web应用的文件存放于此目录中
- work //Tomcat把由JSP生成的Servlet放于此目录下
- 第一步: 找到conf/server.xml
- 第二步: 修改port属性
1.3.修改tomcat的默认端口号
<Connector port="8081" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
1.4.Web项目的目录结构
- / : 根目录,WebContent
- /WEB-INF: 下面的文件客户端不能直接访问.(受保护的)
- /WEB-INF/classes: 放到class文件
- /WEB-INF/lib: 放jar包
- 第一步: 右键启动项目 把workspace中项目下面的WebContent的内容 复制到指定的tomcat的项目的下面.(发布,部署) 真正的启动tomcat
- 第二步: 访问项目(访问的是tomcat中的项目) http://localhost:8080/项目名/资源名
1.5.部署启动过程
1.6. 配置访问页面(默认访问页面)
在/WEB-INF/web.xml中. 修改welcome-file项的值.
例:<welcome-file>abc.html</welcome-file>
1.7.page指令
语法:<%@ page 属性=""... %>
1.7.1 常见属性
language ="java"
import //导入的jar包
contentType //jsp编码格式
1.8.小脚本和表达式
1.8.1 小脚本(普通脚本)
语法: <% java代码 %>
例: <% int a =1 %>
1.8.2 表达式(输出脚本)
语法: <%=表达式 %>
1.8.3 声明脚本
语法:<%! 方法 %>
1.9. JSP中的注释
1.9.1 JSP注释
语法: <%-- 内容 --%>
<%--jsp注释 --%>
<%!
//脚本注释
//int a = 10;
public String format(Date d){
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
%>
1.9.2 脚本注释
<%!
//脚本注释
//int a = 10;
public String format(Date d){
SimpleDateFormat sdf =
new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(d);
}
%>
1.10. JSP执行过程
- 三个阶段
翻译阶段
编译阶段
执行阶段
第一次访问---->服务器jsp--->翻译成java文件-->编译成class-->执行class文件
第二次访问--->服务器jsp-->执行class文件
注意 :如果对JSP文件进行了修改,Web容器会重新对JSP文件进行翻译和编译
1.11. 常见错误
1.11.1 未启动tomcat
1.11.2 未部署Web应用
1.11.3 URL输入有误
错误: http://localhost:8080/jsp/webConent/0101.jsp
1.11.4 目录不能访问(WEB-INF)
错误: http://localhost:8080/jsp/WEB-INF/0101.jsp
第二章 JSP数据交互
2.1. JSP的9种内置对象
request、response、session、application、out、pagecontext、config、page、exception
2.2. request对象
2.2.1 常用方法
- String getParameter(String name) //根据表单name属性值,获取对应的值.
- String[] getParameterValues(String name) //根据表单name属性值获取相同name属性的值
- void setCharacterEncoding(String charset) //指定请求的编码
- RequestDispatcher getRequestDispatcher(String path)//返回RequestDispatcher对象,该对象的forward( )方法用于转发请求
- test.html
2.2.2 案列
<form name="form1" method="post" action="test.jsp">
<table border="0" align="center">
<tr> <td>用户名</td><td> <input type="text" name="name"></td></tr>
<tr><td>密码</td><td > <input type="password" name="pwd"> </td></tr>
<tr> <td>信息来源</td><td>
<input type="checkbox" name="channel" value="报刊">报刊
<input type="checkbox" name="channel" value="网络">网络
<input type="checkbox" name="channel" value="朋友推荐"> 朋友推荐
<input type="checkbox" name="channel" value="电视"> 电视
</td></tr>
<!--省略提交、取消按钮 -->
<tr>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
- test.jsp
<%
//设置请求编码格式
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
String[] values = request.getParameterValues("channel");
%>
姓名:<%=name %> <br/>
密码:<%=pwd %> <br/>
<%
for(String str: values){
out.print(str);
}
%>
2.3 乱码解决方式
2.3.1 POST提交方式乱码
//在获取值前设置请求编码格式 request.setCharacterEncoding("utf-8");
2.3.2 GET提交方式乱码
- 第一种(不推荐使用) :
name = new String(name.getBytes("ISO-8859-1"),"UTF-8");
- 第二种(推介使用) 修改tomcat的server.xml文件(加上URIEncoding="UTF-8")
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8" />
2.4 response对象
2.4.1 封装了应答数据对象
2.4.2 常用方法
方法 |
作用 |
sendRedirect(String) |
用于转发 |
2.5 重定向和转发
2.5.1 重定向
- 语法:response.sendRedirect()
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if("admin".equals(name)&&"123456".equals(pwd)){
// todo 跳到成功页面 重定向
response.sendRedirect("succes.jsp");
}else{
//todo 跳到登录页面
response.sendRedirect("login.html");
}
%>
2.5.2 转发
- 语法: request.getRequestDispatcher("路径").forward(request, response);
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if("admin".equals(name)&&"123456".equals(pwd)){
// todo 跳到成功页面 重定向
//response.sendRedirect("succes.jsp");
//转发
request.getRequestDispatcher("succes.jsp").forward(request, response);
}else{
//todo 跳到登录页面
//response.sendRedirect("login.html");
request.getRequestDispatcher("login.html").forward(request, response);
}
2.5.3 转发和重定向的区别
转发 |
重定向 |
转发是在服务器端发挥作用,将同一请求在服务器资源之间进行传递 |
重定向是在客户端发挥作用,通过发送一个新的请求实现页面转向 |
客户端浏览器的地址栏不会显示转向后的地址 |
在地址栏中可以显示转向后的地址 |
2.6 session(会话)
2.6.1 session和浏览器窗口
每个session对象都与一个浏览器窗口对应 ,重新开启一个浏览器窗口,可以重新创建一个session对象(一个窗口一个会话)
通过超链接打开的新窗口,新窗口的session与其父窗口的session相同
2.6.2 常用方法
方法名 |
作用 |
String getId() |
获取sessionid |
void setMaxInactiveInterval(int interval) |
设定session的非活动时间 |
int getMaxInactiveInterval() |
获取session的有效非活动时间(以秒为单位) |
void invalidate() |
设置session对象失效 |
void setAttribute(String key, Object value) |
以key/value的形式保存对象值 |
Object getAttribute(String key) |
通过key获取对象值 |
void removeAttribute(String key) |
从session中删除指定名称(key)所对应的对象 |
2.6.3 登录验证
- 在登录成功时,设置标志
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
if("admin".equals(name)&&"123456".equals(pwd)){
//登录成功的标记
session.setAttribute("flag", true);
//设置非活动有效期
session.setMaxInactiveInterval(60);
// todo 跳到成功页面 重定向
response.sendRedirect("succes.jsp");
//转发
//request.getRequestDispatcher("succes.jsp").forward(request, response);
}else{
//todo 跳到登录页面
response.sendRedirect("login.html");
//request.getRequestDispatcher("login.html").forward(request, response);
}
%>
- 在增加时(其他业务处)验证
<%
Object obj = session.getAttribute("flag");
if(obj==null||(obj!=null&&(boolean)obj!=true)){
response.sendRedirect("login.jsp");
return ;
}
%>
2.6.4 session对象失效
- 手动设置失效:invalidate()
- 超时失效
- 通过setMaxInactiveInterval( )方法,单位是秒
- 通过设置项目的web.xml或Tomcat目录下的/conf/web.xml文件,单位是分钟
<session-config>
<session-timeout>10</session-timeout>
</session-config>
2.7 include指令
2.7.1 作用
可以将一些共性的内容写入一个单独的文件中,然后通过include指令引用该文件
2.7.2 语法
<%@ includ file="路径" %>
2.7.3 改造登录验证
- 新建jsp
<%
Object obj = session.getAttribute("flag");
if(obj==null||(obj!=null&&(boolean)obj!=true)){
response.sendRedirect("login.jsp");
return ;
}
%>
- 修改原来的验证代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="loginValidation.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//从session取到值.如果为true.可以增加,否则调到登录页面.
/* Object obj = session.getAttribute("flag");
if(obj!=null){
Boolean flag = (Boolean)obj;
if(flag){
out.print("增加");
}else{
response.sendRedirect("login.jsp");
}
}else{
response.sendRedirect("login.jsp");
}*/
out.print("增加");
%>
</body>
</html>
2.8 base标签
<base href="路径" /> 当前页面所有的请求路径,不是从当前目录去找,而是从base指定的路径下面去找.
第三章 JSP数据交互(二)
3.1 application
3.1.1 概念
- application实现用户之间的数据共享
3.1.2 常用方法
方法名 |
作用 |
void setAttribute(String key,Object value) |
以key/value的形式保存对象值 |
Object getAttribute(String key) |
通过key获取对象值 |
String getRealPath(String path) |
返回相对路径的真实路径 |
3.1.3 案例:统计网站访问次数的实现
<%
//每一次来+1
//获得原来数据.
Integer num = (Integer)application.getAttribute("count");
//再+1
if(null!=num){
num++;
}else{
num = 1;
}
//保存
application.setAttribute("count", num);
%>
<%= application.getAttribute("count") %>
<%= application.getRealPath("/cout.jsp") %>
3.2 对象的作用域
3.2.1 作用域的分类
- page作用域(pageContext 对象 )
- request作用域
- session作用域
- application作用域
- page作用域指本JSP页面的范围
- 案例:pageOne.jsp
3.2.2 page作用域
<%
String name ="zy";
pageContext.setAttribute("name", name);
%>
<%= pageContext.getAttribute("name") %>
<!-- 静态包含和 动态包含 -->
<%@ include file="pageTwo.jsp" %>
<%--
<%
pageContext.include("pageTwo.jsp");
%>
--%>
- pageTwo.jsp
<%= pageContext.getAttribute("name") %>
3.2.3 request作用域
- request作用域内的对象则是与客户端的请求绑定在一起(一次请求)
- 案列: reqeustOne.jsp
<%
request.setAttribute("name", "zs");
//转发
//request.getRequestDispatcher("requestTwo.jsp").forward(request, response);
%>
<!--
<a href="requestTwo.jsp">跳到rquestTwo.jsp</a>
-->
- requestTwo.jsp
requestTwo
<%= request.getAttribute("name")%>
3.2.4 session作用域
- 一次会话
- 案列:sessionOne.jsp
<%
session.setAttribute("userId", "123456");
%>
<%= session.getAttribute("userId") %>
<a href="sessionTwo.jsp">跳到sessionTwo.jsp</a>
- sesisonTwo.jsp
<%= session.getAttribute("userId") %>
3.2.4 application作用域
- 面对整个Web应用程序
- 案列:applicationOne
<%
application.setAttribute("userId", "123456");
%>
<%= application.getAttribute("userId") %>
<a href="applicationTwo.jsp">跳到application.jsp</a>
- applicationTwo.jsp
<%= application.getAttribute("userId") %>
3.3 对象作用域小结
名称 |
说明 |
page作用域 |
在一个页面范围内有效,通过pageContext对象访问 |
request作用域 |
在一个服务器请求范围内有效 |
session作用域 |
在一次会话范围内容有效 |
application作用域 |
在一个应用服务器范围内有效 |
3.4 静态包含和动态包含
- 静态包含:<%@ include file=”包含页面”%>
- 动态包含<jsp :include page=“a.jsp”/>
- 静态include是先把被包含文件的内容全部复制内嵌到包含文件中,再进行编译运行的。
- 动态include执行到了include语句的时候才触发被包含文件的编译、执行,并实时把结果包含进来。
- 动态include与静态include的最大不同在于:包含文件与被包含文件都是先编译执行,再包含