EL表达式: ${}
使用之前需要导包:
<!-- 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>
<%@ 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>
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>
实体类
javaBean有特定的写法:
一般用来合数据库的字段就进行映射 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>
什么是MVC:
model、view、Controller
模型、视图、控制器
Model
View
Controller(Servlet)
登录-》接收用户的登录请求-》处理用户的请求(获取用户登录的参数、username、psaaword)-》交给业务层处理登录业务(判断用户名密码是否正确:事务)-》Dao层查询用户名和密码是否正确-》数据库
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>
实现一个监听器的接口:(有很多种)
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、看情况是否使用
监听器:
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实现权限拦截)
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);
什么是JDBC:java连接数据库!
需要jar包的支持:
实验环境搭建:
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(); } } }