1.JSP
1.1JSP的三大指令
- page
- include
- taglib
指令的写法
<%@ 指令名字 %>
1.1.1jsp的page指令
1.extends 用于指定jsp翻译成java文件后,继承的父类是谁,一般不改
2.session 值为true或false///控制jsp页面是否可直接使用session对象;
3.errorPage和isErrorPage
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp"%>
错误信息跳转页面
errorPage="error.jsp"
错误信息显示界面error.jsp
isErrorPage=“true”
1.1.2include指令
包含另外一个jsp页面进来【有先后顺序】
index.jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="other.jsp" %>
<body>
第一个页面
</body>
other.jsp页面
<body>
这是other页面
</body>
tomcat输出顺序:
这是other页面 第一个页面
1.1.3taglib指令
<%@ taglib prefix="" uri="" %>
uri:标签库路径
prefix:标签库别名
1.2jsp动作标签
<body>
<jsp:forward page=""></jsp:forward>
<jsp:param value="" name=""/>
<jsp:include page=""></jsp:include>
</body>
1.jsp:include>>>>>>>>包含指定页面,动态包含,只拿包含页面的结果,不拿元素
<jsp:include page="other02.jsp"></jsp:include>
2.jsp:forward >>>>> 跳转到指定页面
<jsp:forward page="other02.jsp"></jsp:forward>
3.jsp:param>>>>>> 在包含某个页面时候,或跳转某个页面时候,加入该参数
index.jsp页面
<body>
<jsp:forward page="other02.jsp">
<jsp:param value="shanghai" name="address"/>
</jsp:forward>
</body>
other02.jsp页面
<body>
this is OTHER02
<br >收到参数是:<br>
<%= request.getParameter("address")%>
</body>
1.3jsp内置对象
1.九大内置对象
1.pageContext:可以取到其他八个对象===例子:<% pageContext.getSession(); %>
2.request 3.application
4.out 5.exception
6.page 7.config
8.response 9.session
2.四大作用域:表示这些对象可以存值,取值范围有限定
<body>
1.使用作用域存储数据<br>
<%
pageContext.setAttribute("name", "page");
request.setAttribute("name", "request");
session.setAttribute("name", "session");
application.setAttribute("name", "application");
%>
取出四个作用域的值<br>
<%= pageContext.getAttribute("name") %>
<%= request.getAttribute("name") %>
<%= session.getAttribute("name") %>
<%= application.getAttribute("name") %>
</body>
3.四个作用域的区别
*pageContext: 作用域值仅限当前页面
*request: 作用域值仅限一次请求,只要服务器做出响应,该域的值就没有了;
*session: 作用域限于一次会话
*application: 整个工程都可以访问,服务器关闭后就不能访问
4.response 和 out 区别
缓冲区的区别,如下:
<body>
这是other05页面<br>
<%
out.write("这是使用out输出的内容");
%>
<br>
<%
response.getWriter().write("这是使用response输出的内容");
%>
</body>
【面试】首先输出:这是使用response输出的内容
原因?
原因:首先会把out输出的内容放到response的缓冲区去;所以会首先输出response本身要输出的内容,然后输出out的内容
2.EL表达式
为了简化jsp代码而出现
格式:${表达式}
代码实例:运用EL取值
<body>
【存值】<br>
<%
pageContext.setAttribute("name", "pageContext存值");
request.setAttribute("name", "request存值");
session.setAttribute("name", "session存值");
application.setAttribute("name", "application存值");
%>
【普通取值】<br>
<%=pageContext.getAttribute("name") %><br>
【EL取值】<br>
${pageScope.name}
${requestScope.name}
${sessionScope.name}
${applicationScope.name}
</body>
运行结果
【存值】
【普通取值】
pageContext存值
【EL取值】
pageContext存值 request存值 session存值 application存值
2.1List取值
<body>
<%
ArrayList list = new ArrayList();
list.add(111);
list.add("222");
pageContext.setAttribute("li", list);
%>
${li[0]},${li[1]}
</body>
结果111,222
2.2map取值
把值存到pageContext的作用域中
pageContext.setAttribute("map", map);
<body>
<%
Map map = new HashMap();
map.put("name", "zhangsan");
map.put("age", 23);
map.put("address.a","Bj");
pageContext.setAttribute("map", map);
%>
${map.name},${map.age },${map["address.a"]}
</body>
结果zhangsan,23,Bj
注意
<%
pageContext.setAttribute("name", "zhangsan");
session.setAttribute("name", "lisi");
%>
1.先从page里面找,没有再去request里面去找>session>application
${name}
输出结果zhangsan
2.从指定session中取值
${sessionScope.name }
输出结果从指定session中取值 lisi
2.3EL表达式的11个内置对象【面试题】
1.pageContext
作用域相关对象
2.pageScope
3.requestScope
4.sessionScope
5.applicationScope
头信息相关对象
6.header
7.headerValues
参数信息相关对象
8.param
9.paramValues
10.cookie
全局初始化参数
11.initParam
3.JSTL
3.1引入
1.导入jar文件到webcontent/web-inf/lib下【jstl.ajr和standard.jar】
2.引入jstl1.1版本【alt+/】
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
3.2JSTL基本用法
1.常用标签
—set
var:声明一个变量
value:存储的值为zhangsan
scope:代表存到指定的域中,默认存在page域中
<c:set var="name" value="zhangsan" scope="session"></c:set> <!-- //存值 -->
${sessionScope.name}
<!--${name} --> <!-- 取值 -->
结果:zhangsan
–if
test="${EL表达式}":如果满足if里的el表达式,则执行<c:if></c:if>里的语句【不存在else】;
var:定义一个变量接受返回的结果
scope:结果存在哪个域里
<c:set var="age" value="17"></c:set>
<c:if test="${age>16}" var="flag" scope="session">对,年龄大于16岁</c:if>
${flag}
结果:对,年龄大于16岁 true
—foreach
<c:forEach begin="1" end="10" step="2" var="i">
${i}
</c:forEach>
结果:1 3 5 7 9
item:要遍历的对象,【里面必须接收EL表达式】
var:遍历得到的每一个元素,使用var去接收;
<%
ArrayList list = new ArrayList();
list.add(new Person("张三",23));
list.add(new Person("张四",24));
list.add(new Person("张五",25));
pageContext.setAttribute("l", list);
%>
<c:forEach var="i" items="${l}">
${i.name},${i.age}
</c:forEach>
输出结果:张三,23 张四,24 张五,25
4.三个知识点的综合案例分析—一个简单的学生管理系统
第一步:在WebContent下创建一个登录页面Login.jsp
<body>
<h2>欢迎使用学生管理系统</h2>
<form action="LoginServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
第二步:创建一个用于处理登录逻辑的servlet,这里命名为LoginServlet
/**
* @author ZHENG
* 用于处理登录的Servlet
*/
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//处理提交数据为中文的情况
request.setCharacterEncoding("UTF-8");
//取数据
String userName = request.getParameter("username");
String passWord = request.getParameter("password");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
第三步:创建数据库和Dao
1.创建一张用户表【t_user】,用来登录管理系统;
2.创建学生信息表【t_stu】,登录后用来查询等操作
3.创建UserDao接口,并创建UserDaoImpl实现这个接口;
/**
* @author ZHENG
* 对用户表的访问
*/
public interface UserDao {
/**
* 简单的实现,如果成功返回True
* 登录失败返回false
*/
boolean login();
}
【XX】已经提前做好的JDBCUtil集成环境和jdbc的配置文件
public class JDBCUtil {
static String driverClass = null;
static String url = null;
static String name = null;
static String password= null;
static{
try {
//1.创建一个属性配置对象
Properties properties = new Properties();
//2.使用类加载器,读取src下的资源文件
InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
properties.load(is);
driverClass = properties.getProperty("driverClass");
url = properties.getProperty("url");
name = properties.getProperty("name");
password = properties.getProperty("password");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* @return
*/
public static Connection getConn(){
Connection conn = null;
try {
Class.forName(driverClass);
conn = DriverManager.getConnection(url, name, password);
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
public static void release(Connection conn , Statement st , ResultSet rs){
closeRs(rs);
closeSt(st);
closeConn(conn);
}
public static void release(Connection conn , Statement st){
closeSt(st);
closeConn(conn);
}
private static void closeRs(ResultSet rs){
try {
if(rs != null){
rs.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
rs = null;
}
}
private static void closeSt(Statement st){
try {
if(st != null){
st.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
st = null;
}
}
private static void closeConn(Connection conn){
try {
if(conn != null){
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
conn = null;
}
}
}
jdbc.properties配置文件
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost/stus
name=root
password=123456
第四步:创建UserDaoImpl实现UserDao这个接口
public class UserDaoImpl implements UserDao {
@Override
public boolean login() {
try {
//获取连接
Connection conn = JDBCUtil.getConn();
//判断是否连接成功
System.out.println("数据库状态:"+ conn.isClosed());
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
return false;
}
}
5.实战小项目:学生信息管理系统
提前做好的JDBCUtil集成环境和jdbc的配置文件
成型预览:
第一步:创建Login.jsp,并且搭配一个LoginServlet来获取用户登录信息;
<body>
<h2>欢迎使用学生管理系统</h2>
<form action="LoginServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
第二步:创建用户表和学生信息表
第三步:创建UserDao,定义登录方法,并创建UserDaoImpl实现登录的方法;
/**
* @author
* 对用户表的访问
*/
public interface UserDao {
/**
* 简单的实现,如果成功返回True
* 登录失败返回false
*/
boolean login(String userName, String passWord);
}
public class UserDaoImpl implements UserDao {
@Override
public boolean login(String userName,String passWord) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();//1.获取连接
String sql = "select * from t_user where username=? and password=?";//2.sql的查询语句
ps = conn.prepareStatement(sql);//3.获取sql语句,创建ps对象
ps.setString(1, userName);
ps.setString(2, passWord);
/* ps.executeUpdate();//增删改使用 */
rs = ps.executeQuery();//4.执行sql>>>>>>/*查询用*/
return rs.next();//5.若成功,移到下一条记录,表明存在这个记录
/*//判断是否连接成功
System.out.println("数据库状态:"+ conn.isClosed());
*/
} catch (SQLException e) {
e.printStackTrace();
}finally{
//6.关闭
JDBCUtil.release(conn, ps, rs);
}
return false;
}
}
第四步:在LoginServlet访问UserDao,判断登录结果;
第七步已经实现
第五步:创建stu_list.jsp,当用户成功登录则跳转到该页面;
第八步已经实现
第六步:定义学生StuDao,并创建StuDaoImpl实现该接口;
/**
* @author ZHENG
* 查询所有的学生信息
* @return List集合
*/
public interface StuDao {
List<Student> findAll();
}
public class StuDaoImpl implements StuDao {
@Override
public List<Student> findAll() {
List<Student> list = new ArrayList<Student>();
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtil.getConn();//1.获取连接
String sql = "select * from t_stu";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
//循环获取信息,一个学生的
while(rs.next()){
Student s = new Student();
s.setId(rs.getInt("id"));
s.setAge(rs.getInt("age"));
s.setName(rs.getString("name"));
s.setGender(rs.getString("gender"));
s.setAddress(rs.getString("address"));
list.add(s);
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
//6.关闭
JDBCUtil.release(conn, ps, rs);
}
return list;
}
}
第七步:在LoginServle中先查出所有的学生,把查到的学生集合存到作用域中,跳转到stu_list.jsp;
/**
* @author ZHENG
* 用于处理登录的Servlet
*/
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.处理提交数据的中文
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//2.获取客户端提交的信息
String userName = request.getParameter("username");
String passWord = request.getParameter("password");
//3.创建UserDaoImpl的对象,调用login方法,将前台接收的数据传给login;
UserDaoImpl dao = new UserDaoImpl();
boolean isSuccess = dao.login(userName, passWord);
//4.针对dao的返回结果做出响应
if(isSuccess){
/* //写到页面上的话
response.getWriter().write(userName+"先生,您已成功登录学生管理系统");*/
//4.1查询所有学生的信息
StuDao sim = new StuDaoImpl();
List<Student> list = sim.findAll();
//4.2把集合存到Session这个作用域
request.getSession().setAttribute("list", list);
//4.3重定向实现页面跳转
response.sendRedirect("stu_list.jsp");
}else{
response.getWriter().write("抱歉登录失败");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
第八步:在stu_list.jsp中取出域集合,然后使用c标签遍历集合;
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<title>学生管理信息页面</title>
</head>
<body>
<h2>学生信息表</h2>
<table border="1" width="700" cellspacing="0">
<tr align="center">
<td>编号</td>
<td>姓名</td>
<td>年龄</td>
<td>性别</td>
<td>地址</td>
<td>操作</td>
</tr>
<c:forEach items="${list}" var="i" >
<tr align="center">
<td>${i.id}</td>
<td>${i.name}</td>
<td>${i.age}</td>
<td>${i.gender}</td>
<td>${i.address}</td>
<td><a href="stu_list.jsp">更新</a> <a href="#">删除</a></td>
</tr>
</c:forEach>
</table>
</body>