JSP && EL && JSTL

                                        jsp:Java Server Page  

什么是jsp?

从用户角度看待 ,就是是一个网页 , 从程序员角度看待 , 其实是一个java类, 它继承了servlet,所以可以直接说jsp 就是一个Servlet.

为什么会有jsp?

html 多数情况下用来显示静态内容 , 一成不变的。 但是有时候我们需要在网页上显示一些动态数据, 比如: 查询所有的学生信息, 根据姓名去查询具体某个学生。  这些动作都需要去查询数据库,然后在网页上显示。 html是不支持写java代码  , jsp里面可以写java代码。 

 三大指令:                                                      

          page
          include
          taglib

三个动作标签:
          <jsp:include>
          <jsp:forward>
          <jsp:param>

九个内置对象:

          四个作用域
              pageContext
              request
              session
              application      
          out
          exception
          response
          page
          config


怎么用JSP?

 指令写法:<%@ 指令名字 %>

 三大指令:

【1】page指令

language:表明jsp页面中可以写java代码

contentType:其实即使说这个文件是什么类型,告诉浏览器我是什么内容类型,以及使用什么编码 

     contentType="text/html; charset=UTF-8"

     text/html  MIMEType 这是一个文本,html网页

pageEncoding : jsp内容编码

extends: 用于指定jsp翻译成java文件后,继承的父类是谁,一般不用改。

import :导包使用的,一般不用手写。

session :

> 值可选的有true or false .

> 用于控制在这个jsp页面里面,能够直接使用session对象。

> 具体的区别是,请看翻译后的java文件   如果该值是true , 那么在代码里面会有getSession()的调用,如果是false :  那么就不会有该方法调用,也就是没有session对象了。在页面上自然也就不能使用session了。

errorPage:指的是错误的页面, 值需要给错误的页面路径

isErrorPage:上面的errorPage 用于指定错误的时候跑到哪一个页面去。 那么这个isErroPage , 就是声明某一个页面到底是不是错误的页面。是错误页面的跳转页面要写成(true)

【2 】include 

包含另外一个jsp的内容进来。(静态包含)

<%@ include file="other02.jsp"%>

 背后细节:把另外一个页面的所有内容拿过来一起输出。 所有的标签元素都包含进来。

【3】taglib

<%@ taglib prefix=""  uri=""%>  

                                        uri: 标签库路径                  prefix : 标签库的别名  


3个动作标签

         <jsp:include page=""></jsp:include>
	<jsp:param value="" name=""/>
	<jsp:forward page=""></jsp:forward>

【1】jsp:include:

         <jsp:include page="other02.jsp"></jsp:include>

包含指定的页面, 这里是动态包含。 也就是不把包含的页面所有元素标签全部拿过来输出,而是把它的运行结果拿过来。

【2】 jsp:forward:前往哪一个页面

	<jsp:forward page=""></jsp:forward>

    请求转发:

request.getRequestDispatcher("other02.jsp").forward(request, response);

【3】jsp:param

意思是: 在包含某个页面的时候,或者在跳转某个页面的时候,加入这个参数。

	<jsp:forward page="other02.jsp">
		<jsp:param value="beijing" name="address"/>
	</jsp:forward>
	
	在other02.jsp中获取参数
	<br>收到的参数是:<br>
	<%= request.getParameter("address")%>

9大内置对象:所谓内置对象,就是我们可以直接在jsp页面中使用这些对象。 不用创建。

4个作用域对象:

 pageContext
 request
 session
 application

作用域 :表示这些对象可以存值,他们的取值范围有限定。  setAttribute   和  getAttribute

      使用作用域来存储数据

                <%
		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")%>

作用域范围大小:pageContext << request << session << application 

四个作用域的区别:

* pageContext 【PageContext】

    > 作用域仅限于当前的页面。  

    > 还可以获取到其他八个内置对象。

* request 【HttpServletRequest】

    > 作用域仅限于一次请求, 只要服务器对该请求做出了响应。 这个域中存的值就没有了。

* session 【HttpSession】

    > 作用域限于一次会话(多次请求与响应) 当中。 

* application 【ServletContext】

    > 整个工程都可以访问, 服务器关闭后就不能访问了。

其他5个内置对象:

- out         【JspWriter】
   - response  【HttpServletResponse】

- exception  【Throwable】
  - page     【Object】 ---就是这个jsp翻译成的java类的实例对象
    - config 【ServletConfig】
 


                                               El表达式


是为了简化咱们的jsp代码,具体一点就是为了简化在jsp里面写的那些java代码。(主要是为了取值)

 写法格式:    ${表达式 }

如果从作用域中取值,会先从小的作用域开始取,如果没有,就往下一个作用域取。  一直把四个作用域取完都没有, 就没有显示。

如何使用:

    1. 取出4个作用域中存放的值。

		<%
			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")%>
		
		<br>使用EL表达式取出作用域中的值<br>
		
		${ pageScope.name }
		${ requestScope.name }
		${ sessionScope.name }
		${ applicationScope.name }

     2.如果域中所存的是数组

                <%
   			String [] a = {"aa","bb","cc","dd"};
   			pageContext.setAttribute("array", a);
   		%>
   		
   		使用EL表达式取出作用域中数组的值<br> 
   		${array[0] } , ${array[1] },${array[2] },${array[3] }

   2.如果域中所存的是集合

list集合:

	<%
		List list=new ArrayList();
		list.add("11");
		list.add("22");
		list.add("33");
		list.add("44");
		pageContext.setAttribute("li", list);
	%>
	<br>EL表达式方法取集合的值:<br>
	${li[0]},${li[1]},${li[2]},${li[3]}

Map集合:

	<%
	Map map=new HashMap();
	map.put("name", "张三");
	map.put("age", 18);
	map.put("address.ad", "西安");
	pageContext.setAttribute("map", map);
	%>
	<br>EL表达式方法取集合的值:<br>
	${map.name},${map.age},${map["address.ad"]}

取值细节:

1.  从域中取值,  得先存值。

	<%
	pageContext.setAttribute("name", "西安");
	session.setAttribute("name", "李四");
	%>
	
    <br>直接指定说了,到这个作用域里面去找这个name<br>
    ${ pageScope.name } 

    <br>//先从page里面找,没有去request找,去session,去application <br>
    ${ name }
 
    <br>指定从session中取值<br>
    ${ sessionScope.name }  

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 } 

一般使用EL表达式,用的比较多的,都是从一个对象中取出它的属性值,比如取出某一个学生的姓名。

EL表达式 的11个内置对象

${ 对象名.成员 }

- pageContext 

作用域相关对象
- pageScope
- requestScope
- sessionScope
- applicationScope

头信息相关对象
- header
- headerValues

参数信息相关对象
- param
- paramValues

- cookie
  全局初始化参数
- initParam
 


                                               JSTL


》全称 : JSP Standard Tag Library  jsp标准标签库

》简化jsp的代码编写。 替换 <%%> 写法。 一般与EL表达式配合

怎么使用:

    1. 导入jar文件到工程的WebContent/Web-Inf/lib  jstl.jar standard.jar

    2. 在jsp页面上,使用taglib 指令,来引入标签库

    3. 注意: 如果想支持 EL表达式,那么引入的标签库必须选择1.1的版本,1.0的版本不支持EL表达式。
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


常用标签:

<c:set></c:set>
<c:if test=""></c:if>
<c:forEach></c:forEach>

c:set:设定一个值

		<!-- 声明一个对象name, 对象的值 zhangsan , 存储到了page(默认) , 指定是session -->
		<c:set var="name" value="zhangsan" scope="session"></c:set>
		
		${sessionScope.name }

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:

	<!-- 从1 开始遍历到10 ,得到的结果 ,赋值给 i ,并且会存储到page域中, step , 增幅为2, -->
	<c:forEach begin="1" end="10" step="1" var="i">
		${i }
	</c:forEach>

遍历一个集合:

	<%
	
	List list=new ArrayList();
	list.add(new User("zhangsan",18));
	list.add(new User("wangwu",8));
	list.add(new User("zhaoliu",68));
	list.add(new User("cnsa",25));
	pageContext.setAttribute("person", list);
	
	%>
	
	<!-- items : 表示遍历哪一个对象,注意,这里必须写EL表达式。 
		var: 遍历出来的每一个元素用user 去接收。 -->
	<c:forEach var="user" items="${person }">
		${user.name}----${user.age }
	</c:forEach>

*******************************学生管理系统************************************


实例工程:StuManager

登录页面:login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<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>
</html>

处理登录页面的servlet:StuManager/src/it/cast/servlet/LoginServlet.java

package it.cast.servlet;

import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import it.cast.servlet.dao.impl.StuDaoImpl;
import it.cast.servlet.dao.impl.UserDaoImpl;

/**
 * 这是用于处理登录页面的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.去dao查询账号和密码是否正确
		boolean boo = new UserDaoImpl().login(username, password);
		
		//4.针对dao的返回结果做出响应
		if (boo) {
			//1.查询出学生信息结果
			StuDaoImpl stus=new StuDaoImpl();
			List<Studnet> stu_list = stus.findAll();
			
			//把数据存储到session
			request.getSession().setAttribute("list", stu_list);
			
			//2.跳转到页面
			response.sendRedirect("stu.jsp");
			
		} else {
			response.getWriter().write("用户名或密码错误");
		}
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

处理登录用户的dao接口:StuManager/src/it/cast/servlet/dao/UserDao.java

package it.cast.servlet.dao;

public interface UserDao {
	/**
	 * 这里是一个很简单的Boolean类型
	 * @param username 账号
	 * @param password 密码
	 * @return true:登录成功;false:登录失败
	 */
	
	boolean login(String userName,String password);
}

dao的实现:StuManager/src/it/cast/servlet/dao/impl/UserDaoImpl.java

package it.cast.servlet.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import it.cast.jdbc.util.JDBCUtil;
import it.cast.servlet.dao.UserDao;
/**
 *用户登录的dao实现
 */

public class UserDaoImpl implements UserDao {

	public boolean login(String userName,String password) {
		
		Connection conn =null;
		PreparedStatement ps =null;
		ResultSet rs =null;
		try {
			conn = JDBCUtil.jdbcConn();
//			System.out.println("数据库的连接状态"+conn.isClosed());
			//执行数据库查询
			String sql="select * from t_suer where username=? and password=?";
			ps = conn.prepareStatement(sql);
			ps.setString(1, userName);
			ps.setString(2, password);
			rs = ps.executeQuery();
			//返回查询结果
			return rs.next();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.resease(rs, ps, conn);
		}
		return false;
	}
}

要存储的学生信息的类:/StuManager/src/it/cast/servlet/Studnet.java

package it.cast.servlet;
/**
 * 要存储的学生信息的类
 */

public class Studnet {
	private int id;
	private String name;
	private String gender;
	private int age;
	private String address;
	
	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 String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}

 查询学生信息的dao接口:/StuManager/src/it/cast/servlet/dao/StuDao.java

package it.cast.servlet.dao;
import java.util.List;
import it.cast.servlet.Studnet;

public interface StuDao {
	/**
	 * 查询学生信息的dao接口
	 */
	public List<Studnet> findAll();
}

dao接口的实现:/StuManager/src/it/cast/servlet/dao/impl/StuDaoImpl.java

package it.cast.servlet.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import it.cast.jdbc.util.JDBCUtil;
import it.cast.servlet.Studnet;
import it.cast.servlet.dao.StuDao;

/**
 *查询学生信息的dao实现
 */

public class StuDaoImpl implements StuDao {

	public List<Studnet> findAll() {
		
		Connection conn =null;
		PreparedStatement ps =null;
		ResultSet rs =null;
		//创建List集合来装载查询结果对象
		List<Studnet>list=new ArrayList<Studnet>();
		try {
			//连接数据库
			conn = JDBCUtil.jdbcConn();
			String sql="select * from t_stu";
			ps = conn.prepareStatement(sql);
			rs = ps.executeQuery();
			
			while (rs.next()) {//一次遍历是一个学生,需要把数据结果放到studnet对象里
				Studnet stu=new Studnet();
				stu.setId(rs.getInt("id"));
				stu.setAddress(rs.getString("address"));
				stu.setAge(rs.getInt("age"));
				stu.setGender(rs.getString("gender"));
				stu.setName(rs.getString("name"));
				list.add(stu);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.resease(rs, ps, conn);
		}
		return list;
	}
}

学生信息列表页面:stu.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>学生信息页面</h2>
	<table border="1" width="700">
		<tr align="center">
			<td>编号</td>
			<td>姓名</td>
			<td>年龄</td>
			<td>性别</td>
			<td>地址</td>
		</tr>
		<c:forEach var="stu" items="${list }">
			<tr align="center">
				<td>${stu.id }</td>
				<td>${stu.name }</td>
				<td>${stu.age }</td>
				<td>${stu.gender }</td>
				<td>${stu.address }</td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

数据库登录工具类:JDBCUtil

package it.cast.jdbc.util;

import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class JDBCUtil {
	
	static String driverClass=null;
	static String url=null;
	static String usename=null;
	static String password=null;
	static {
		try {
			//1.创建一个属性配置文件对象
			Properties properties = new Properties();
			
            //InputStream is=new FileInputStream("jdbc.properties")//配置文件在工程根目录下
			//使用类加载器加载src地下的配置文件
			InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");
			properties.load(is);
			//读取属性
			driverClass = properties.getProperty("driverClass");
			url = properties.getProperty("url");
			usename = properties.getProperty("usename");
			password = properties.getProperty("password");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	/*
	 * jabc的连接
	 */
	public static Connection jdbcConn() {
		Connection conn=null;
		try {
			//1.注册驱动,4.0以后可以不用注册
			Class.forName("com.mysql.jdbc.Driver");//里面是Driver的全路径
			//因为Driver有静态代码块,类加载就执行,相当于注册了两回,没有必要。java.sql.DriverManager.registerDriver(new Driver());
			//DriverManager.registerDriver(new com.mysql.jdbc.Driver());
			
			//2.建立连接    参数一:协议+访问的数据库,参数二:用户名 ,参数三:密码;
			conn = DriverManager.getConnection(url, usename, password);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	/*
	 * 关闭数据库的方法,释放资源
	 */
	public static void resease(ResultSet rs,Statement st,Connection conn) {
		rsclose(rs);
		stclose(st);
		connclose(conn);
	}
	public static void resease(Statement st,Connection conn) {
		stclose(st);
		connclose(conn);
	}
	private static void rsclose(ResultSet rs) {
		try {
			if(rs!=null)
			rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	private static void stclose(Statement st) {
		try {
			if(st!=null)
				st.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	private static void connclose(Connection conn) {
		try {
			if(conn!=null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}	
}

数据库:

1.登录用户数据库  t_suer

2.保存学生数据的数据库  t_stu

猜你喜欢

转载自blog.csdn.net/TDOA1024/article/details/84836175