前言------- 每一天总会有各种各种样的事情,但是不论如何,必须要坚持下去!!
目录
JSP的详解
什么是jsp
在普通人眼里jsp就是一个页面。在程序员眼中,jsp就是一个Servlet类,java代码
为什么使用jsp
html大多数是显示的静态页面,是一成不变的。有的时候,我们需要显示一些动态的数据,比如查询学生的信息,根据学生的姓名去查询某个具体的学生,需要查询数据库。而html是不支持java语言的
为了能够动态的显示数据,所以要在页面中插入java代码,所以出来了jsp技术。
jsp的基本用法
jsp的指令
page指令、include指令、taglib指令
指令的写法:
<%@ 指令的名字 具体的动作(比如各种属性) %>
- page指令
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
language="java":表明jsp页面中可以写java代码
content-Type="text/html; charset=utf-8":表明告诉浏览器我这个文件的内容类型和使用的编码
text/html MIMEType 这是一个文本,html网页
pageEncoding=“utf-8”:表明使用的内容编码是utf8
extends=" 父类":用于指定jsp翻译成java代码后继承的父类是谁。一般不用改
import=“包路径”:用于导包,一般不手动写
session=“true/false”:
默认是true,表明jsp页面能够使用session(HttpSession)对象,false表明不可以使用。 在具体的编译成java代码后,如果是true能够使用session,java代码中会有getSession()方法。 如果是false,java代码中没有该方法。
errorPage=“error.jsp ”:
表明当前的jsp页面出现错误的时候跳转到error.jsp,值需要给错误的页面路径,在error.jsp页面中的page指令也要配合相应的属性
isErroePage="true/false" :
上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。 true表示是
- include指令
include包含的意思
<%@ include file="one.jsp" %>
表明把另外一个one.jsp的内容包含进来。
file=“one.jsp”:表示要包含的jsp的具体的路径。
注意:这是静态包含:先把one.jsp中的内容全部拿到当前的页面(包括各种标签),然后再一起编译。
在jap动作标签中<jsp:include page="one.jsp"></jsp:include>是动态包含,先编译好one.jsp的内容,然后再包含进来。
include包含内部java代码
- taglib指令
运用于JSTL标签库
<%@ taglib prefix="" uri="" %>
prefix:标签库的别名
uri:标签库的地址
jsp的动作标签
常用的jsp动作标签
<jsp:include page=""></jsp:include>
<jsp:forward page=""></jsp:forward>
<jsp:param value="" name=""/>
- <jsp:include page="one.jsp" ></jsp:include>
动态包含,先把one.jsp的页面编译出来,把内容放到当前的页面。也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。以后都用动态包含。内部java代码
- <jsp:forward page="two.jsp"></jsp:forward>
请求转发,转发到具体的页面。转发到two.jsp页面。服务器内部转发. 相当于Servlet中的如下代码
request.getRequestDispatcher("two.jsp").forward(request,response);
- <jsp:param value="beijing" name="city" />
在包含某个页面 或者在跳转某个页面加入这个参数
<jsp:forward page="other02.jsp"> <jsp:param name="address" value="beijing"></jsp:param> </jsp:forward> 在other.jsp中获取参数的值 <%=request.getParameter("city") %>
内部代码如下,相当于在url后面跟上了参数 http://localost:8080/JspServlet/other02.jsp?adress=beijing
jsp的九大内置对象
所谓的jsp内置对象就是我们在jsp页面中直接使用,不用创建
pageContext、request、session、application 四大作用域对象
response、out、excation、page、config
一共九大内置对象
- 四大作用域对象,对应的java类
作用域
表示这些对象可以存值,但是取值的范围有限定
setAttribute("name","value"); 使用该方法存值
getAttribute("name"); 使用该方法获取值,返回的是Object对象
四大作用域对象都有这两个方法
使用作用域来存储数据<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")%>
作用域范围的大小:pageContext << request << session <<application
四个作用域的区别
pageContext【PageContext】
作用仅限于当前页面。 还可以获得其他的八大内置对象 pageContext.getXXX();
request【HttpServletRequest】
作用域只限于一次的请求,只要服务器对请求做了相应,这个域中的值就没有了
session【HttpSession】
作用域限于一次会话,多次的请求和响应,不同的浏览器访问不属于一个会话
application【ServletContext】
整个工程都可以访问,不同的浏览器不同的会话都可以访问,服务器关闭就不可以了
- 其他五大内置对象
out【JspWriter】对象和response【HttpServletResponse】对象的区别
excetion【Throwable】
page【Oject,HttpJspPage】这个就是jsp翻译成java类的实例对象
config【ServletConfig】
EL表达式
EL表达式的作用
为了简化jsp代码,其实就是简化在jsp中的java代码。使用EL表达式就是简化取值的代码。(取值操作)
都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。
EL表达式的写法格式
${表达式 }
如果从域中取值,会先从小的作用域开始,如果没有,再依次扩大作用域的范围。直到把四大作用域都取完都没有,就没有显示
EL的十一大内置对象
作用域相关的对象 (其实就是Map对象)
pageScope
requestScope
sessionScope
applicationScope
头信息相关的对象 (其实就是Map对象)
header
headValues
参数相关的对象 (其实就是Map对象)
param
paramValues
cookie
全局初始化参数相关对象 (其实就是Map对象)
initParam
=========================================================================================
pageContext(和jsp内置对象pageContext一样,使用方法有点区别,EL中使用的是 . 没有getXX方法什么的 )
EL表达式的具体使用
- 取出四个作用域存放的值
<% pageContext.setAttribute("name", "page"); request.setAttribute("name", "request"); session.setAttribute("name", "session"); application.setAttribute("name", "application"); %> 普通的手段取值 <% pageContext.getAttribute("name") request.getAttribute("name"); session.getAttribute("name"); application.getAttribute("name"); %> EL表达式的取值手段 ${pageScope.name} ${requestScope.name} ${sessionScope.name} ${applicationScope.name}
- 取出作用域存放的数组
<% String [] a = {"aa","bb","cc","dd"}; pageContext.setAttribute("array", a); %> 使用EL表达式取数组 ${pageScope.array[0]}, ${pageScope.array[1]}, ${pageScope.array[2]}, ${pageScope.array[3]},
- 取出作用域存放的集合
<% List<String> li = new ArrayList(); li.add("11"); li.add("22"); %> 使用EL“表达式取值,相当于取第0个对象,取第一个对象 ${li[0]}, ${li[1]}
- 取出Map集合中的数据
<% Map map = new HashMap(); map.put("name","haha"); map.put("age",18); map.put("address.aa","beijing"); application.setAttribute("map",map); %> 使用EL取出map集合中的数据,取出来的是一个对象,之后就去这个对象中的元素 ${applicationScope.map.name}, 可以省略applicationScope,这样取值的话麻烦一点,先从小的作用域开始 ${map.name} 如果最后一项key出现了address.aa这种 . 的特殊字符使用 [] 取值 ${map["address.aa"]}
- EL表达式取值细节
1、从域中取值,得先存值
<% //pageContext.setAttribute("name", "zhangsan"); session.setAttribute("name", "lisi..."); %>
直接指定取值的范围,就是直接说要在哪个域里面进行取值,如果没有,也不会去其他域里面找
${pageScope.name}
如果没有指明范围,把pageScope省略,
${name} 先从page里面找,没有去request找,去session,去application
取值先从最小的作用域开始找,pageContext --> request -->session --->application
2、取值方式
如果这份值是有下标的,那么直接使用 [ ] 取值
<% String [] array = {"aa","bb","cc"} session.setAttribute("array",array); %> ${ array[1] } --> 这里array说的是attribute的name
如果这份值没有下标,直接使用 . 的方式去取值
<% User user = new User("zhangsan",18); session.setAttribute("u", user); %> ${ u.name } , ${ u.age }
JSTL标签库
JSTL的作用
全称:Jsp Standard Tag Library
因为EL表达式只能做一些取值的操作,像一些循环遍历等的操作不可以,所以出来了引入第三方的jar包,JSTL标签库
一般简化了jsp中的<%%>和其中的java代码,配合EL表达式使用
JSTL的使用
1、导入jar文件到web资源目录下的 web/WEB_INF/lib 目录下 jstl.jar standard.jar
2、在jsp页面中使用 taglib 指令 引入标签库
注意,引用的时候如果想支持EL表达式,必须选1.1的版本,1.0的版本不支持EL表达式
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> prefix="c" : 是为引入的核心标签库core中的标签起了个别名 uri:引入的JSTL标签库的路径
常用的标签库
设置属性值,并默认存在pageContext域中 <c:set></c:set> if语句,test是判断的内容 <c:if test=""></c:if> for循环,items要循环的变量,var每次循环接收的参数 <c:forEach var="" items=""> </c:forEach>
- <c:set></c:set>
相当于String name = "zhangsan" 保存在session域中 <!-- 声明一个对象name, 对象的值 zhangsan , 存储到了pageContext(默认) , 指定是session --> <c:set var="name" value="zhangsan" scope="session"></c:set> ${name }
- <c:if test=""></c:if>
判断test里面的表达式是否满足,如果满足,就执行c:if标签中的输出 , c:if 是没有else的。
<c:set var="age" value="18" ></c:set> <c:if test="${ age > 26 }"> 年龄大于了26岁... </c:if> <c:if test="${ age <= 26 }"> 年龄小于了26岁... </c:if> 定义一个变量名 flag 去接收前面表达式的值,然后存在session域中 <c:if test="${ age > 26 }" var="flag" scope="session"> 年龄大于了26岁... </c:if>
- <c:forEach var="" items=""> </c:forEach>
从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2, <c:forEach begin="1" end="10" var="i" step="2"> ${i } </c:forEach> ----------------------------------------------- items : 表示遍历哪一个对象,注意,这里必须写EL表达式。 var: 遍历出来的每一个元素用user 去接收。 <c:forEach var="user" items="${list }"> ${user.name } ----${user.age } </c:forEach>
案例:学生信息管理系统
案例分析:
代码实现:
dao层:业务的定义层(接口) UserDao.java StudentDao.java
daoImpl:业务的具体实现层(接口实现类) UserDaoImpl.java StudentDaoImpl.java
servlet:具体与页面交互层的Servlet 。 Login_Servlet.java
util:工具层 --- 连接数据库 JDBCUtil.java
domain:需要自定义的对象,对象层,存储用户信息。 Student.java
- login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录页面</title> </head> <body> <br><h3>用户登录页面</h3><br> <form action="loginServlet" method="post" > 用户名:<input type="text" name="username"><br> 密码:   <input type="password" name="password"><br> <input type="submit" value="登录"> </form> </body> </html>
- Login_Servlet.java
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ //提交的数据有可能有中文, 怎么处理。 request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf-8"); //1、获取用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+" "+password); try { //2、查询数据库,看是否有该用户,有的话登录成功,否则失败 // 2. 去访问dao , 看看是否满足登录。 UserDao dao = new UserDaoImpl(); boolean isSuccess = dao.login(username, password); //3. 针对dao的返回结果,做出响应 if(isSuccess){ //怎么样在页面中浏览学生的信息数据? 先查询,在保存到作用域中,响应时候带着数据 //1、查询数据库中学生信息表的数据,每个学生是一个对象,多个学生存一个集合,并返回一个list集合 StudentDao stu = new StudentDaoImpl(); List<Student> list = stu.findStudent(); //2、把list集合存在作用域中 HttpSession session = request.getSession(); session.setAttribute("list",list); //3、跳转页面,重定向 response.sendRedirect("stu_list.jsp"); }else{ response.getWriter().write("用户名或密码错误"); } } catch (SQLException e) { e.printStackTrace(); } }
- UserDao.java 和 UserDaoImpl.java
package com.web.dao; import java.sql.SQLException; /** * 该dao定义了对用户表的访问规则 */ public interface UserDao { //实现登录功能,登录成功,返回true ,登录失败,返回false //在实际应用开发中,一般登录成功,返回这个用户的个人信息 boolean login(String userName, String passWord) throws SQLException; }
public class UserDaoImpl implements UserDao { @Override //实现定义的方法 public boolean login(String userName, String passWord) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { //1. 得到连接对象 con = JDBCUtil.getCon(); String sql = "select * from user where username=? and password =?"; //2. 创建ps对象 ps = con.prepareStatement(sql); ps.setString(1,userName); ps.setString(2,passWord); //开始执行 rs = ps.executeQuery(); //如果能够成功移到下一条记录,那么表明有这个用户。 return rs.next(); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtil.closeResource(rs,ps,con); } return false; } }
- StudentDao.java 和 StudentDaoImpl.java
public interface StudentDao { //查询出所有学生的信息.返回List集合 List<Student> findStudent(); }
public class StudentDaoImpl implements StudentDao { @Override public List<Student> findStudent() { List <Student> list = new ArrayList<Student>(); try { Connection con = JDBCUtil.getCon(); String sql = "select * from student"; PreparedStatement ps = con.prepareStatement(sql); ResultSet rs = ps.executeQuery(); //一个信息存变量,多个信息存对象,多个对象存集合 while (rs.next()){//每遍历一次,是一个学生的信息,遍历多次,就是多个学生的信息 Student stu = new Student(); stu.setName(rs.getString("name")); stu.setId(rs.getInt("id")); stu.setAge(rs.getInt("age")); stu.setSex(rs.getString("sex")); stu.setAddress(rs.getString("address")); list.add(stu); } } catch (SQLException e) { e.printStackTrace(); } return list; }
- Student.java
public class Student { //你如果想要在页面上显示几个信息,这地方就写几个变量。 //而不是根据你在数据库表中定义的几列就写几个变量,是根据你想要在页面上显现几列而定义几个变量 private int id; private String name; private int age; private String sex; private String address; //为了方便,向外提供get 和 set方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
- stu_list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <html> <head> <title>学生信息管理页面</title> </head> <body> <h3>学生信息管理</h3> <table border="1" width="700px"> <tr align="center"> <td>学生编号</td> <td>姓名</td> <td>年龄</td> <td>性别</td> <td>住址</td> <td>操作</td> </tr> <c:forEach items="${sessionScope.list}" var="stu"> <tr align="center"> <td>${stu.id}</td> <td>${stu.name}</td> <td>${stu.age}</td> <td>${stu.sex}</td> <td>${stu.address}</td> <td><a href="#">修改</a> <a href="#">删除</a></td> </tr> </c:forEach> </table> </body> </html>
总计图谱