jsp将内容的生成和展示相分离;jsp运行在服务器端,本质上是一个servlet,产生的Java文件和class保留在tomcat的word目录下。
errorPage属性
errorPage属性的设置值可以使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前页面。
可以在web.xml文件中使用<error-page>元素为整个WEB应用程序设置错误处理页面,其中的<exception-type>子元素指定异常类的完全限定名,<location>元素指定以“/”开头的错误处理页面的路径。但如果设置了某个JSP页面的errorPage属性,那么在web.xml文件中设置的错误处理将不对该页面起作用。
<%@ page language="java" import="java.util.*" errorPage="/directive/error.jsp" pageEncoding="UTF-8"%>
<html>
<head>
<title>测试page指令的errorPage属性</title>
</head>
<body>
<%
//这行代码肯定会出错,因为除数是0,一运行就会抛出异常
int x = 1/0;
%>
</body>
</html>
<error-page>
<error-code>404</error-code>
<location>/error/hello?i=1</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/WEB-INF/error/500.jsp</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/exception/error.jsp</location>
</error-page>
=========================================
1、jsp指令
1.1、include指令:
静态包含,就是将其他页面或者servlet的内容包含进来,一起进行编译运行.生成一个
记住,生成到一个java文件中
java文件.
格式:<%@include file="相对路径或者是内部路径" %>
例如:
<%@include file="/jsp/include/i1.jsp" %>
路径:
相对路径:
./或者什么都不写 当前路径
上一级路径 ../
绝对路径:
带协议和主机的绝对路径
不带协议和主机的绝对路径
/项目名/资源
内部路径:
不带协议和主机的绝对路径去掉项目名
请求转发(java请求转发,jsp请求转发) 静态包含 动态包含
-------------------------------------------------------------------------------------------------
1.2、taglib指令:导入标签库
格式:<%@taglib prefix="前缀名" uri="名称空间" %>
若导入之后
<前缀名:标签 .. >
例如:
<c:if test="">输出内容</c:if>
--------------------------------------------------------------------------------------------------
1.3、jsp内置对象
jsp的内置对象:★★★(9大内置对象)
在jsp页面上可以直接使用的对象
内置对象 类型
out JspWriter
request HttpServletRequest
response HttpServletResponse
session HttpSession
exception Throwable(isErrorPage=true的时候才能使用)
page Servlet(java文件中用this,jsp中用page)
config ServletConfig
application ServletContext(servlet之间有通信,依赖于上下文,全局管理者)
pageContext PageContext(当前页面的上下文)
jsp的域对象:理解
application 整个项目
session 一次会话
request 一次请求
pageContext 一个页面
pagecontext作用:理解
1.域对象
xxxAttribute()
2.操作其他域对象
方法:
xxxAttribute(...,int scope);(操作哪个域就把他写上去)
scope取值:
APPLICATION_SCOPE
SESSION_SCOPE
REQUEST_SCOPE
PAGE_SCOPE
3.获取其他的内置对象
getXxx()
注意:
getRequest():获取request内置对象
4.便捷查找,
findAttribute(String key):
依次从pagecontext,request,session,application四个域中,查找相应的属性,若查找到了返回值,且结束该次查找
若查找不到,返回一个null
jsp的动作标签
<jsp:forward>:请求转发 相当于java中 request.getRequestDispatcher(..).forward(..);
<jsp:forward page="内部路径"></jsp:forward>
<jsp:include>:动态包含
就是将被包含页面或者servlet的运行结果包含到当前页面中.
<%
pageContext.setAttribute("rkey","rvalue",PageContext.REQUEST_SCOPE);
%>
<%=request.getAttribute("rkey") %>
<%
pageContext.setAttribute("rkey", "rvalue", PageContext.REQUEST_SCOPE);
session.setAttribute("rkey", "svalue");
%>
通过pagecontext往request中放入一个值,取出来:<%=request.getAttribute("rkey") %>
<hr>
获取session中的rkey:<%=session.getAttribute("rkey") %><br>
便捷查找:<%=pageContext.findAttribute("rkey") %><br>
便捷查找:<%=pageContext.findAttribute("akey") %><br>
<jsp:forward page="/jsp/action/for1.jsp"></jsp:forward>
<body>
include页面
<hr>
i1的内容:<%@include file="/jsp/include/i1.jsp" %>
<hr>
i1的内容:<%@include file="/jsp/include/i2.jsp" %>
</body>
===================================
2、EL表达式(jsp内的表达式语言)
1)概述
jsp的内置表达式语言,从jsp2.0开始.
用来替代<%=..%>
作用:
1.获取域中数据 ★
2.执行运算 ★
3.获取常见的web对象
4.调用java的方法
格式:
${el表达式}
2)获取域中的数据
注意:★
若属性名中出现了"."|"+"|"-"等特殊符号,需要使用scope获取
例如: ${requestScope["arr.age"] }
a、获取简单数据
${pageScope|requestScope|sessionScope|applicationScope.属性名}
以后经常使用:
${属性名}:依次从pageContext,request,session,application查找指定属性,若查找到返回值,结束该次查找若查找不到,返回""
<%
pageContext.setAttribute("pkey","pvalue");
request.setAttribute("rkey","rvalue");
session.setAttribute("skey","svalue");
application.setAttribute("akey","avalue");
%>
<hr/>
<%=pageContext.getAttribute("pkey") %><br>
<%=request.getAttribute("rkey") %><br>
<%=session.getAttribute("skey") %><br>
<%=application.getAttribute("akey") %><br>
<%=application.getAttribute("aakey") %>(jsp获取域对象获取的是null)
<hr/>
${pageScope.pkey }<br>
${requestScope.rkey }<br>
${sessionScope.skey }<br>
${applicationScope.akey }<br>
(${applicationScope.aakey }el表达式获取的是空字符串)
<hr/>
便捷获取
${pkey },${rkey },${skey },${akey },${aakey }
b、获取复杂的数据
${域中的名称[index]}
获取list中的数据
${域中的名称[index]}
获取map中的数据
${域中的名称.键名}
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.ArrayList"%>
<%@ page import="java.util.List" %>
<%
request.setAttribute("arr",new String[]{"a1","a2","a3","a4"});
List list = new ArrayList();
list.add("list1");
list.add("list2");
list.add("list3");
list.add("list4");
request.setAttribute("list",list);
Map map = new HashMap();
map.put("name","shuzk");
map.put("age",15);
request.setAttribute("map",map);
request.setAttribute("shuzk.age",23);
%>
<%=request.getAttribute("arr") %><br>
<%=((String[])request.getAttribute("arr"))[1] %><br>
${arr[1] }<hr>
<%=((List)request.getAttribute("list")).get(1) %><br>
${list[1] }<hr>
<%=((Map)request.getAttribute("map")).get("name") %><br>
${map.age }<hr>
${requestScope["shuzk.age"] }
c、JavaBean导航
java语言编写的一个可重用的组件,
狭义上来说就是我们编写的一个普通的java类 例如:User Person
javabean规范:
1.必须是一个公共的具体的类 public class
2.提供私有的字段 private String id;//id称之为字段
3.提供公共访问字段的方法 get|set|is方法
public String getId(){..}
一旦有公共的方法之后,get|set|is之后的内容,将首字母小写,将这个东西称之为bean属性
id就是一个bean属性
4.提供一个无参的构造器
5.一般实现序列化接口 serializable
${域中javabean名称.bean属性}
private Integer id;
private String name;
private String password;
<%@page import="domain.User"%>
<%
User u = new User();
u.setId(2);
u.setName("shuzk");
u.setPassword("123");
request.setAttribute("user",u);
%>
<%=((User)request.getAttribute("user")).getName() %>
${user.id }
==================================================================
3)执行运算
四则运算 关系(>..) 逻辑(&& ||)
注意:
+:只能进行加法运算,字符串形式数字可以进行加法运算.
empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空
${empty 域中的对象名称}
三元运算符
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="domain.User" %>
<%
request.setAttribute("i", 3);
request.setAttribute("j", 4);
request.setAttribute("q", "12");
request.setAttribute("k", "k");
List l=null;
request.setAttribute("list", l);
List ll=new ArrayList();
ll.add("22");
request.setAttribute("list_", ll);
User user=null;
request.setAttribute("bean", user);
User user_=new User();
request.setAttribute("bean_", user_);
%>
${i+j }<br/>
${i+q }<br/>
${q+q }<br/>
<%-- ${i+k }<br/> --%>
<hr>
域中list的长度是否为0:${empty list}<br/>
域中list_的长度是否为0:${empty list_ }<br/>
<hr>
域中的bean是否为空:${empty bean }<br/>
域中的bean_是否为空:${empty bean_ }<br/>
<hr>
${ 3>4?"yes":"no" }<br/>
${i==3 }
==================================================================
4)EL的内置对象
11个
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
initParam
cookie★
pageContext★
注意:
除了pagecontext其余对象获取的全是map集合
了解:和参数相关的el内置对象
param
paramValues
了解:和请求头相关的el内置对象
header
haederValues
了解:和全局初始化参数相关的el内置对象
initParam
<a href="/shuzk_a_jsp_EL_jstl/el/demo5.jsp?username=tom&password=123&hobby=drink&hobby=sleep">5</a>
${param.username }
${param.password }
${param }
${paramValues }
${paramValues.hobby[0] }
<hr>
${header }<hr>
${headerValues }
<hr>
referer:${header.referer }<br>
user-agent:${headerValues["user-agent"][0] }<hr>
${initParam }<hr>
${cookie.JSESSIONID.value }
cookie内置对象:
${cookie} 获取map{key=Cookie}
例如:创建cookie
Cookie c=new Cookie("username","tom");
通过${cookie}获取相当于
{username=new Cookie("username","tom")}
相当于map的key是cookie的键
map的value是当前cookie
若项获取名称username的cookie的value值(获取tom)
${cookie.username.value}--javabean导航
注意:
java中Cookie的api
getName():获取cookie的名称
getValue():获取cookie的value值
我们称name和value是cookie的bean属性
使用cookie内置对象:
${cookie.给cookie起名字.value}
例如:
获取jsession的值
${cookie.JSESSIONID.value}
pageContext:获取不是map集合,相当于jsp的pageContext内置对象
在jsp页面中获取项目名
${pageContext.request.contextPath}
==================================================
3、JSTL——JSP的标准标签库
jsp标准的标签库语言;apache的;用来替代java脚本
使用步骤:
1.导入jar包 (jstl.jar和standard.jar)
2.在页面上导入标签库
<%@taglib prefix="" uri=""%>
例如:
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
jstl的分类:
core:核心类库 ★
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用
core:掌握
★c:if
★c:forEach
c:set 往域中设置值
c:choose c:when c:otherwise 分支
★c:if 判断
<c:if test="${el表达式}">满足的时候输出的内容</c:if>
例如:
<c:if test="${3>4 }">
3大于4
</c:if>
<c:if test="${3<=4 }">
3不大于4
</c:if>
//
★c:forEach 循环
格式1:
<c:forEach begin="从那里开始" end="到那里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
varStatus:用来记录循环的状态
常用的属性:
count:记录次数
current:当前遍历的内容
例如:
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i }--${vs.count }--${vs.current }<br>
</c:forEach>
格式2:
<c:forEach items="${el获取域中的容器}" var="n">
${n }
</c:forEach>
例如:
//遍历list
<c:forEach items="${list }" var="n">
${n }
</c:forEach>
//遍历map
<c:forEach items="${map }" var="en">
${en.key }-- ${en.value }<br/>
</c:forEach>
扩展:
c:set 和 c:choose
函数库:
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="java.util.HashSet"%>
<%@page import="java.util.Set"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="day" value="4"></c:set>
<c:choose>
<c:when test="${day==1 }">1</c:when>
<c:when test="${day==2 }">2</c:when>
<c:when test="${day==3 }">3</c:when>
<%-- <c:when test="${day==4 }">4</c:when> --%>
<c:otherwise>
567
</c:otherwise>
</c:choose>
<hr>
<c:if test="${4==5 }">4=5</c:if>
<c:if test="${4<5 }">4<5</c:if>
<hr>
<c:forEach begin="1" end="10" step="1" var="i">${i }</c:forEach>
<hr>
<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
${i }--${vs.count }--${vs.current }<br>
<%-- ${vs } --%>
</c:forEach>
================================<br>
<%
//往域中放入一个list
List l=new ArrayList();
l.add(11);
l.add(22);
l.add(33);
request.setAttribute("list", l);
//往域中放入一个set
Set s=new HashSet();
s.add("11");
s.add("22");
s.add("33");
request.setAttribute("set", s);
//往域中放入一个map
Map m=new HashMap();
m.put("username","tom");
m.put("age","18");
request.setAttribute("map", m);
%>
<c:forEach items="${list }" var="n">
${n }
</c:forEach>
<hr>
<!--
for(Integer n:list){
i
}
-->
<c:forEach items="${set }" var="n" varStatus="vs">
${n }--${vs.count }<br>
</c:forEach>
<hr>
<c:forEach items="${map }" var="en">
${en.key }-- ${en.value }<br/>
</c:forEach>
==================================================================
案例1-步骤分析:
1.数据库和表
create database day12;
use day12;
create table product(
id int primary key auto_increment,
pname varchar(20),
price double,
pdesc varchar(20)
);
insert into product values (null,'电视机',3200,'液晶曲面大电视');
insert into product values (null,'韭菜盒子',3,'味重请小心食用');
insert into product values (null,'益达',10,'韭菜伴侣');
insert into product values (null,'十三香',12,'守义牌');
新建一个项目
导入jar包:
驱动 dbutils c3p0 jstl
导入c3p0配置文件 和工具类
实体类:
private int id;
private String pname;
private double price;
private String pdesc;
2.index.jsp中添加一个连接
<a href="/day1201/findAll">展示所有商品</a>
3.FindAllServlet:
调用ProductService.findAll() 返回一个集合 List<Product>
将list放入request域中
请求转发到product_list.jsp
4.ProductService.findAll() 调用dao.findAll()
5.dao.findAll() 使用beanListHandler()
6.在product_list.jsp展示所有商品
使用 c:forEach
使用javabean导航获取里面的数据
我也遇到了你这样的问题,英文和数字照常显示,中文全变成问好。
你的servlet中的doget方法是自动生成的吧,你把其中的response.getWriter().append("Served at: ").append(request.getContextPath());
去掉试试。
案例2-重写登录案例
需求:
在页面上填写用户名和密码及验证码,点击提交,先校验验证码是否一致.若一致后再去找数据库.顺便记住用户名
添加验证码,重写登陆案例。登陆成功提示欢迎回来,登录失败,在登陆页面提示用户名不匹配。验证码加上去。
表单
验证码
servlet
request
session
cookie
步骤分析:
1.数据库和表
create table user(
id int primary key auto_increment,
username varchar(20),
password varchar(20)
);
2.创建一个项目
包结构
jar包
工具类和配置文件
3.表单 login.jsp
4.表单提交 loginServlet
loginServlet:
获取验证码(从前台传过来和session中)
判断两个验证码是否一致
若不一致:
填写错误信息,请求转发到login.jsp
若一致:获取用户名和密码
调用userService的getuserbyusernameandpassword 返回值 User user
判断user是否为空
若为空:填写错误信息,请求转发到login.jsp
若不为空:
继续判断是否勾选了记住用户名
若勾选:
创建cookie 将用户名放入cookie写回浏览器
将user对象放入session中
页面重定向 index.jsp 展示 xxx:欢迎回来