JavaWeb——JSP

Servlet是运行在服务端一段java代码,是一项动态网页技术,维护难度较大,
为了减少代码量,推出了JSP技术
JSP(java Server pages):java 服务端 页面。是一项动态网页技术,替代Servlet。

用法:

<%@ 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>
	<%
	for(int i=1;i<100;i++){
		out.println(i);
	}
	%>
</body>
</html>

JSP继承了HttpJspBase,HttpJspBase继承了Servlet,jsp本质上就是一个Servlet
执行顺序:将jsp文件翻译(转译).java文件,编译为.class,执行。

JSP脚本

  1. 声明
    <%! 声明%>
    成员变量。
  2. 代码片段
    <%! 代码 %>
    语法规则严格按照java的语法规则执行。
  3. 输出
    <%=输出%>

指令

指令:导包、设置页面信息。
<%@ 指令 属性1=“值1” 属性2=“值2”%>

page指令

属性名称 取值or范围 描述
pageEncoding 当前页面 指定页面编码格式 相当于response.setCharacterEncoding("utf-8")  
contentType 有效的文档类型 客户端浏览器根据该属性判断文档类型 相当于setContentType("text/html;charset=utf-8")
     
buffer 8kb jsp缓存大小   缓冲区越大,刷新频率越低,生成响应速度越快 缓冲区越大,服务器运行压力越大  
autoFlush true / false 是否自动刷新缓冲区  
     
errorPage 某个JSP页面的相对路径 指定一个错误页面,如果该JSP程序抛出一个未捕捉的异常,则转到errorPage指定的页面。errorPage指定页面的isErrorPage属性为true,且内置的exception对象为未捕捉的异常   当前页面出现异常,跳转到哪个页面展示 自动请求转发:服务器端路径  
isErrorPage true / false 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception对象的exception,可直接使用。默认情况下,isErrorPage的值为false   设置当前页面是否为标准错误页面 标准错误页面:可以获取并展示跳转而来页面的错误信息 isErrorPage设置为true以后,多出一个exception变量 exception变量封装了跳转而来页面的异常信息  
     
import 任何包名、类名 指定在JSP页面翻译成的Servlet源文件中导入的包或类。import是唯一可以声明多次的page指令属性。一个import属性可以引用多个类,中间用英文逗号隔开。    
language java 指明解释该JSP文件时采用的语言,默认为Java
session true、false 指明该JSP内是否内置Session对象,如果为true,则说明内置Session对象,可以直接使用,否则没有内置Session对象。默认情况下,session属性的值为true。需要注意的是,JSP 引擎自动导入以下4个包: java.lang.* javax.servlet.* javax.servlet.jsp.* javax.servlet.http.*  

include指令

将其他页面文件导入的指令
静态包含:先导入,再翻译
先导入其他页面,整体翻译。

taglib指令

JSP九大内置对象

内置对象:jsp翻译成servlet之后,
在jspservice()定义的九个对象,用户可以直接使用,不需要new。
因为内置对象是局部变量,所以:<%!声明中不能使用内置对象%>

名称 类型 描述
out javax.servlet.jsp.JspWriter 用于页面输出 JSP输出字符流
request javax.servlet.http.HttpServletRequest 得到用户请求信息。 域对象,针对某次请求
response javax.servlet.http.HttpServletResponse 服务器向客户端的回应信息
config javax.servlet.ServletConfig 服务器配置,可以取得初始化参数 JSP配置信息的封装对象(一般不用)
session javax.servlet.http.HttpSession 用来保存用户的信息 域对象,针对某次会话N次请求
application javax.servlet.ServletContext 所有用户的共享信息 域对象,针对整个项目的所有请求
page java.lang.Object 指当前页面转换后的Servlet类的实例 当前JSP对应的Servlet对象。 (一般不用)  
pageContext javax.servlet.jsp.PageContext JSP的页面容器   域对象,是JSP独有的。 普通Servlet是没有这个域对象 最小的域对象, 作用范围:是当前JSP页面  
exception java.lang.Throwable 表示JSP页面所发生的异常,在错误页中才起作用   设置了isErrorPage=”true”才会出现。 封装了上一个页面的错误信息。  

pageContext对象
域对象:作用域仅限于当前页面。

out对象:输出对象

获取数据库的数据并在网页展示:

数据库

userId  userName  userpassword  userImg    
------  --------  ------------  -----------
     1  jack      abc           jack.jpg   
     3  Queen     que789        queen.jpg  
     5  Acer      ace33333      ace.jpg    
     6  Joker     jocker8888    joker.jpg  
     7  King      king566       king.jpg   

实体类:

package beer.onexone.domain;

public class Users {
	private int userId;
	private String userName;
	private String userpassword;
	private String userImg;
	public Users() {
		super();
	}
	public int getUserId() {
		return userId;
	}
	public void setUserId(int userId) {
		this.userId = userId;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getUserpassword() {
		return userpassword;
	}
	public void setUserpassword(String userpassword) {
		this.userpassword = userpassword;
	}
	public String getUserImg() {
		return userImg;
	}
	public void setUserImg(String userImg) {
		this.userImg = userImg;
	}
	public Users(int userId, String userName, String userpassword, String userImg) {
		super();
		this.userId = userId;
		this.userName = userName;
		this.userpassword = userpassword;
		this.userImg = userImg;
	}
}

Web层

package beer.onexone.web;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import beer.onexone.domain.Users;
import beer.onexone.service.Services;

@SuppressWarnings("all")
@WebServlet("/GetUsers")
public class GetUsers extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		try {
			//创建服务层对象
			Services services = new Services();
			//设置response对象的字符集
			response.setContentType("text/html;charset=utf-8");
			//调用业务逻辑层查询所有商品信息
			List<Users> usersList = services.getUserList();
			//存入请求域
			request.setAttribute("userList", usersList);
			//请求转发
			request.getRequestDispatcher("list.jsp").forward(request, response);
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}

Service层

package beer.onexone.service;


import java.sql.SQLException;
import java.util.List;

import beer.onexone.dao.Operate;
import beer.onexone.domain.Users;


public class Services {

	public List<Users> getUserList() throws SQLException {
		Operate operate = new Operate();
		return operate.doGetList();
	}
}

dao层

package beer.onexone.dao;

import java.sql.SQLException;
import java.util.List;

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;

import beer.onexone.domain.Users;
import online.onexone.utils.C3P0;

public class Operate {

	public List<Users> doGetList() throws SQLException {
		QueryRunner queryRunner = new QueryRunner(C3P0.getDataSource());
		String sql = "select * from userinfo";
		return queryRunner.query(sql, new BeanListHandler<Users>(Users.class));
	}

}

JSP页面:

<%@page import="beer.onexone.domain.Users"%>
<%@page import="java.util.List"%>
<%@ 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>
	<table border="1">
		<tr>
			<th>ID</th>
			<th>Name</th>
			<th>Password</th>
			<th>Image</th>
		</tr>

		<%
			List<Users> list = (List<Users>) request.getAttribute(("userList"));
			for (int i = 0; i < list.size(); i++) {
		%>
		<tr>
			<td><%=list.get(i).getUserId()%></td>
			<td><%=list.get(i).getUserName()%></td>
			<td><%=list.get(i).getUserpassword()%></td>
			<td><img src="img/<%=list.get(i).getUserImg()%>"></td>
		</tr>

		<%
			}
		%>

	</table>
</body>
</html>

EL表达式

EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。

${EL表达式}

  • 只能获取作用域中的数据,
  • 不能储存数据
<%@ 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>
	<%
	String s = "sss";
	request.setAttribute("str", "ooo");
	%>
	<!-- 只能获取域对象 -->
	S:${s }<!-- 无法在页面输出 --><br>
	str:${str }<!-- 输出ooo --><hr>
</body>
</html>
<!-- String -->
	<% 
		String str1 = "字符串1";
		request.setAttribute("str1", str1);
	%>
	String:${str1 }<br/>
	<!-- String[] -->
	<%
		String[] names = {"tom","jack","rose"}; 
		request.setAttribute("names", names);
	%>
	String[]:${names[0] }<br/>
	names:${names }<br/>
	<!--List -->
	<%
		List list = new ArrayList();
		list.add("曹操");
		list.add("刘备");
		list.add("孙权");
		list.add("孙策");
		request.setAttribute("list", list);
	%>
	list:${list }<br/>
	集合中第一个元素:${list.get(0) }<br/>
	<!-- Map -->
	<%
		Map map = new HashMap();
		map.put("name", "黄蓉");
		map.put("sex", "女");
		map.put("age", "18");
		request.setAttribute("map", map);
	%>
	map:${map }<br/>
	name:${map.get("name") }<br/>
	<!-- JavaBean -->
	<%
		Person p = new Person("刘能",50,"男");
		request.setAttribute("p", p);
	%>
	javaBean:${p }<br/>
	<!-- 复合形式  List<JavaBean>   -->
	<%
		List<Person> plist = new ArrayList<Person>();
		plist.add(new Person("周芷若",20,"女"));
		plist.add(new Person("灭绝师太",60,"女"));
		plist.add(new Person("张无忌",20,"男"));
		request.setAttribute("plist", plist);
	%>
	List<JavaBean>:${plist }<br/>
	第一个:${plist.get(0) }

判断数据是否为空,empty,null "" 0

<%-- 	
	1.对象是否为null 
	2.字符串是否为"" 
	3.集合是否为0  
--%>

EL内置对象
可直接在EL表达式中使用的对象

分类 内置对象名称 描述
作用域 专门从指定的作用域中获取数据 pageScope pageContext作用域,不等价于pageContext
  requestScope request作用域,不等价于request
  sessionScope session作用域,不等价于session
  applicationScope application作用域,不等价于application
请求参数 param 获得一个参数,代替 <%=request.getParameter("参数名")%> ${ param.参数名 }
  paramValues 获得一组参数,代替request.getParameterValues("参数名") ${ paramValues.参数名 }
请求头 header 获得一个请求头,代替request.getHeader
  headerValues 获得一组请求头,代替request.getHeaders
JSP上下文对象 pageContext 通过该对象可以获取JSP中的其它8个内置对象 主要用来获取项目名: ${ pageContext.request.contextPath } 相当于<%=pageContext.getRequest().getContextPath()%>
全局初始化参数 initParam 获取全局初始化参数,代替<%=application.getInitParameter("xxx")%>   ${ initParam.abc } ====> 123
cookie cookie 可以直接通过key值获取指定cookie信息,无需遍历Cookie数组 ${ cookie.cookie的名字.属性 } 取值:${ cookie.username.value } 取cookie的名字:${ cookie.username.name } ===> username ...

如果不指定作用域范围,默认是从pageScope-->requestScope-->sessionScope-->applicationScope

JSTL标签

JSP页面中使用java代码,不方便维护,开发难度较大。
EL可以获取数据,不能进行逻辑判断,
JSTL可以实现jsp页面进行逻辑判断。
JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)
使用JSTL导入标签库。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

uri="导入地址"
prefix="别名"

<c:if>

执行if判断。
test属性,如果成立,返回true.否则false.

<c:forEach>

遍历输出:
Items:要遍历的数据或者集合
Var :每次遍历元素。
Begin:从第一个元素开始遍历,下标从0开始
End:到哪个下标结束
Step:步长,增量,增加的下标个数,默认是加一。
varStatus:被遍历数组的其他信息。
Index:下标
Count:遍历的次数。

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
	List<Integer> lis = new ArrayList<Integer>();
	for(int i=0;i<=100;i++){
		lis.add(i);
	}
	request.setAttribute("list", lis);
	request.setAttribute("num", 1);
	request.setAttribute("str", null);
	%>
	
	<c:if test="${not empty num }">
	不为空
	</c:if>
	
	<c:if test="${empty str }">
	为空
	</c:if>
	<hr>
	
	<c:forEach items="${list }" var="li" begin="0" end="100" step="1" varStatus="vs">
		值:${li };<br>
		varStatus.count:${vs.count };<br>
		varStatus.index:${vs.count };<br>
	</c:forEach>
</body>
</html>

JSTL优化案例查询信息的JSP:

<%@page import="beer.onexone.domain.Users"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<table>
		<c:forEach items="${userList }" var="li">
			<tr>
				<td>${li.userId }</td>
				<td>${li.userName }</td>
				<td>${li.userpassword }</td>
				<td><img src="img/${li.userImg}"></td>
			</tr>
		</c:forEach>
	</table>
</body>
</html>

jingsongchan

发表评论

电子邮件地址不会被公开。 必填项已用*标注