JavaWeb学习笔记及案例(一)JSP与EL表达式和JSTL

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>

猜你喜欢

转载自blog.csdn.net/stack_xman/article/details/83744968