8.6 jsp标签、JSTL标签、EL表达式
EL表达式: ${}
- 获取数据
- 执行运行
- 获取web开发的常用对象
使用之前需要导包:
<!-- jstl表达式依赖-->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库-->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
1、jsp标签:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--jsp:include--%>
<jsp:forward page="/jsptag2.jsp">
<jsp:param name="name" value="kuangshen"/>
<jsp:param name="age" value="12"/>
</jsp:forward>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>tag2</h1>
<%--取出参数--%>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>
</html>
2、jstl标签:
JSTL标签库的使用就是为了弥补html标签的不足,它自定义许多标签,可以供我们使用,标签的功能和java代码一样!
-
核心标签(掌握)
-
格式化标签
-
SQL标签
-
XML标签
jstl标签库使用步骤:
1、引入对应的taglib
2、使用其中的方法
3、在tomcat中也需要引入jstl的包,否则报错:JSTL解析错误
<c:if
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--引入JSTL核心标签库,我们才能使用JSTL标签--%>
<%--prefix="c" c表示核心--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if test</h4>
<hr>
<form action="coreif.jsp" method="get">
<%--
EL表达式:获取表达式中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<c:out value="管理员欢迎您!"/>
</c:if>
<%--自闭合标签--%>
<c:out value="${isAdmin}"/>
</body>
</html>
<c:set、<c:choose>、<c:when
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--定义一个变量 score,值为85--%>
<c:set var="score" value="85"/>
<c:choose>
<c:when test="${score>=90}">
优秀
</c:when>
<c:when test="${score>=60}">
及格
</c:when>
<c:when test="${score<80}">
不及格
</c:when>
</c:choose>
</body>
</html>
<c:forEach
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
ArrayList<String> people=new ArrayList<>();
people.add(0,"111");
people.add(1,"111");
people.add(2,"111");
people.add(3,"111");
people.add(4,"111");
request.setAttribute("list",people);
%>
<%--
var,每一次遍历出来的变量
items:要遍历的对象
begin 哪里开始
end 到哪里
step 步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"></c:out>
<br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
<c:out value="${people}"></c:out>
<br>
</c:forEach>
</body>
</html>
9、JavaBean
实体类
javaBean有特定的写法:
- 必须要有一个无参构造
- 属性必须私有化
- 必须有对应的get、set方法
一般用来合数据库的字段就进行映射 ORM
ORM:对象关系映射
- 表-》类
- 字段-》属性
- 行记录-》对象
people表
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
// People people=new People();
%>
<jsp:useBean id="people" class="com.kuang.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="西安"/>
<jsp:setProperty name="people" property="id" value="1"/>
<jsp:setProperty name="people" property="age" value="11"/>
<jsp:setProperty name="people" property="name" value="111"/>
姓名:<jsp:getProperty name="people" property="name"/>
id:<jsp:getProperty name="people" property="id"/>
年龄:<jsp:getProperty name="people" property="age"/>
地址:<jsp:getProperty name="people" property="address"/>
</body>
</html>
10、MVC三层架构
什么是MVC:
model、view、Controller
模型、视图、控制器
10.1 架构图解释
Model
- 业务处理:业务逻辑(Service)
- 数据持久层:CRUD(Dao)
View
- 展示数据
- 提供链接发起Servlet请求(a、form、img……)
Controller(Servlet)
- 接收用户的请求:(req:请求参数、session的信息……)
- 交给业务层处理对应的代码
- 控制视图的跳转
登录-》接收用户的登录请求-》处理用户的请求(获取用户登录的参数、username、psaaword)-》交给业务层处理登录业务(判断用户名密码是否正确:事务)-》Dao层查询用户名和密码是否正确-》数据库
11、过滤器Filter
Filter:过滤器,用来过滤网站的数据
- 处理中文乱码
- 登录验证……
Filter开发步骤:
1、导包,注意不要倒错包
2、编写过滤器
实现filter接口,重写对应的方法即可
package com.kuang.filter;
import javax.servlet.*;
import java.io.IOException;
public class CharacterEncodingFilter implements Filter {
//初始化 :web服务器启动,就开始初始化了,随时等待过滤对象出现!
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init");
}
//chain:链
/**
* 1、过滤器中的所有代码,在过滤特定请求的时候都会执行
* 2、必须要让过滤器继续执行
* filterChain.doFilter(servletRequest, servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截终止!
*/
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletResponse.setContentType("text/html;charset=utf-8");
servletRequest.setCharacterEncoding("utf-8");
servletResponse.setCharacterEncoding("utf-8");
System.out.println("执行前……");
filterChain.doFilter(servletRequest, servletResponse);//让我们的请求继续走,如果不写,程序到这里就被拦截终止!
System.out.println("执行后……");
}
// 销毁 :web服务器关闭的时候,过滤会销毁
public void destroy() {
System.out.println("destroy");
}
}
3、在web.xml中配置filter
<filter>
<filter-name>Character</filter-name>
<filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Character</filter-name>
<!-- 只要是 /servlet 的任何请求,都会经过这个过滤器-->
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
12、监听器
实现一个监听器的接口:(有很多种)
1、编写一个监听器
实现监听器的接口
package com.kuang.listener;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
//统计网站在线人数:统计session
public class OnlineCountListener implements HttpSessionListener {
//创建session监听:看你的一举一动
// 一旦创建session就会触发一次这个事件
public void sessionCreated(HttpSessionEvent httpSessionEvent) {
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
Integer onlineCount = (Integer)servletContext.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount=new Integer(1);
}else{
int count=onlineCount.intValue();
onlineCount=new Integer(count+1);
}
servletContext.setAttribute("OnlineCount",onlineCount);
}
//销毁session监听
// 一旦销毁session就会触发一次这个事件
public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
ServletContext servletContext = httpSessionEvent.getSession().getServletContext();
System.out.println(httpSessionEvent.getSession().getId());
Integer onlineCount = (Integer)servletContext.getAttribute("OnlineCount");
if(onlineCount==null){
onlineCount=new Integer(0);
}else{
int count=onlineCount.intValue();
onlineCount=new Integer(count-1);
}
servletContext.setAttribute("OnlineCount",onlineCount);
}
/**
* session销毁:
* 1、手动销毁
* getSession().invalidate()
* 2、自动销毁
* <session-config>
* <session-timeout>1</session-timeout>
* </session-config>
*/
}
2、web.xml种注册监听器
<!-- 注册监听器-->
<listener>
<listener-class>com.kuang.listener.OnlineCountListener</listener-class>
</listener>
3、看情况是否使用
13、过滤器、监听器的常见应用
监听器:
1、GUI编程中经常使用:
package com.kuang.listener;
import org.omg.CORBA.SystemException;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
public class TestPanel {
public static void main(String[] args) {
Frame frame = new Frame("happy");
Panel panel=new Panel(null);//面板
frame.setLayout(null);
frame.setBounds(300,300,500,500);
frame.setBackground(new Color(0,0,255));//设置背景颜色
panel.setBounds(50,50,300,300);
panel.setBackground(new Color(0,255,0));
frame.add(panel);
frame.setVisible(true);
//监听事件。监听关闭事件
// frame.addWindowListener(new WindowListener() {
// public void windowOpened(WindowEvent e) {
// System.out.println("open");
// }
//
// public void windowClosing(WindowEvent e) {
// System.out.println("closeing");
// System.exit(0);
// }
//
// public void windowClosed(WindowEvent e) {
// System.out.println("closed");
// }
//
// public void windowIconified(WindowEvent e) {
//
// }
//
// public void windowDeiconified(WindowEvent e) {
//
// }
//
// public void windowActivated(WindowEvent e) {
// System.out.println("激活");
// }
//
// public void windowDeactivated(WindowEvent e) {
// System.out.println("未激活");
// }
// });
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
super.windowClosing(e);
}
});
}
}
2、用户登录之后才能进入主页!用户注销之后就不能进入主页了!
(Filter实现权限拦截)
- 用户登录之后,向session中放入用户的数据
- 进入主页的时候要判断用户是否已经登录,要求:在过滤器中实现!
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
Object user_session = request.getSession().getAttribute("USER_SESSION");
if(user_session==null){
response.sendRedirect("/errror.jsp");
}
filterChain.doFilter(servletRequest, servletResponse);
14、JDBC
什么是JDBC:java连接数据库!
需要jar包的支持:
- java.sql
- javax.sql
- mysql-connector-java 连接驱动,必须要导入的
实验环境搭建:
1、导入数据库依赖
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
</dependencies>
2、idea中导入依赖
3、jdbc固定步骤:
package com.kuang.tests;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class TestJdbc {
public static void main(String[] args) throws Exception {
//配置信息
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="root";
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
//3、向数据库发送SQL的对象Statement:CRUD
Statement statement = connection.createStatement();
// 4、编写SQL
String sql="SELECT * from users";
//5、执行查询SQL,返回一个ResultSet 结果集
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()){
System.out.println("id="+resultSet.getObject("id"));
System.out.println("id="+resultSet.getObject("name"));
System.out.println("id="+resultSet.getObject("password"));
System.out.println("id="+resultSet.getObject("email"));
System.out.println("id="+resultSet.getObject("birthday"));
}
//6、关闭链接,释放资源(一定要做),先开后关
resultSet.close();
statement.close();
connection.close();
}
}
增删改查:
注意返回值为受影响的行数
预编译SQL
package com.kuang.tests;
import java.sql.*;
class TestJdbc2 {
public static void main(String[] args) throws Exception {
//配置信息
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="root";
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库,代表数据库
Connection connection = DriverManager.getConnection(url, username, password);
// 3、编写SQL
String sql="insert into users(id, name, password, email, birthday) values(?,?,?,?,?)";
//4、预编译
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setInt(1,2);//给第一个占位符?的值赋值为1
preparedStatement.setString(2,"111");//给第一个占位符?的值赋值为1
preparedStatement.setString(3,"11");//给第一个占位符?的值赋值为1
preparedStatement.setString(4,"11");//给第一个占位符?的值赋值为1
preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第一个占位符?的值赋值为1
//5、执行sql
int i = preparedStatement.executeUpdate();
if(i>0){
System.out.println("insert success");
}
//6、关闭链接,释放资源(一定要做),先开后关
preparedStatement.close();
connection.close();
}
}
事务:
要么都成功,要么都失败!
ACID原则:保证数据的安全
开启事务
事务提交 commit
事务回滚 rollback
关闭事务
junit单元测试:
依赖:
<!-- 单元测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
简单使用:
@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!
package com.kuang.tests;
import org.junit.Test;
public class TestJdbc3 {
@Test
public void test(){
System.out.println("hello");
}
}
事务测试:
package com.kuang.tests;
import org.junit.Test;
import java.sql.*;
public class TestJdbc3 {
@Test
public void test() throws SQLException {
//配置信息
String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
String username="root";
String password="root";
Connection connection=null;
try {
//1、加载驱动
Class.forName("com.mysql.jdbc.Driver");
//2、连接数据库,代表数据库
connection = DriverManager.getConnection(url, username, password);
//3、通知数据库开启事务,false开启
connection.setAutoCommit(false);
String sql = "update account set money=money-100 where name=\"111\";";
connection.prepareStatement(sql).executeUpdate();
//制造错误
// int i = 1 / 0;
String sql2 = "update account set money=money+100 where name=\"222\";";
connection.prepareStatement(sql2).executeUpdate();
connection.commit();//以上两条SQL都执行成功了,就提交事务!
System.out.println("success!");
}catch (Exception e) {
try {
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}finally {
//6、关闭链接,释放资源(一定要做),先开后关
connection.close();
}
}
}