所有笔记均为笔者网课所记笔记。如有侵权,联系必删。如果错误,一定改正。
客户端收到一个不是他的请求后,去通知另外一个客户端资源的过程叫做重定向。
常用场景:用户登录
通过设置响应头 响应的状态码 或者直接使用重定向的方法
重定向和转发之间的区别
相同点:页面都会实现跳转
不同点:请求转发时 url地址栏不会发生变化
重定向页面跳转时地址栏也会发生变化
HttpServletRequest代表客户端,通过HTTP协议访问服务器,并且将返回的信息封装到
HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息。
获取前端传递的参数
会话:用户从打开浏览器到关闭浏览器之间的操作叫做一次会话
Cookie一种客户端技术
响应 请求
session
服务器技术 ,利用这个技术 可以保存用户的会话信息
我们可以把信息和数据放在session 中 除此之外 context rquset 都可以保存数据
好处 网站登陆后,下次不用再登录了
输出流:
在servlet里 PrintWriter out = response.getWriter() 从HttpServletResponse中get一个PrintWriter,取一个响应客户端的流对象 打个通俗的比方就是通过HttpServletResponse对象得到一支笔,然后就可以用out.print()方法在网页上写任何你想显示的内容。 out.print("<html><body>"); out.print("任何内容"); out.print("</body></html>"); 通过PrintWrite,以流方式输出html,返回给客户端,显示在IE上。 最后 out.close(); 关闭流
Cookie 方法 Cookie.getName();// 获得Cookie中的key Cookie.getValue(); // 获得Cookie 中的vlaue Cookie[] cookies = req.getCookies(); // 获得Cookie new Cookie("键",值); // 新建一个Cookie cookie.setMaxAge(24*60*60); // 设置cookie 的有效期 resp.addCookie(cookie); // 响应给客户端一个cookie
删除cookie的方法
不设置有效期 关闭浏览器 自动删除
设置有效期时间为0
创建一个 cookie ,与要删除的cookie名字相同
编码类
encode 编码 decode 解码
session 是服务端技术
服务器会给每一位用户(浏览器)创建一个session 对象
一个session 独占整个浏览器,只要浏览器没有关闭, 这个session 就存在
用户登录之后,整个网站它都可以访问
我们也可以手动给session 设置有效时间 在web.xml 中设置session 的有效时间
cookie和session 之间的区别 1. cookie是把用户的数据写到用户的浏览器中,浏览器保存(可以保存多个) 2. Session 把用户的数据写到用户独占的Session 中,服务器端保存(服务器端主要用来保存重要信息,减少对服务器资源的浪费) 3.session 对象由服务创建 主要使用场景: 保存一个登录用户的信息 购物车信息 在整个网站中经常会看到使用的数据,我们将他保存在session 中 注销session session.invalidate();
Java Server Pages: java服务器端的页面 也和servlet 一样,用于动态
jsp本质上就是一个servlet
jsp中封装了很多的函数和内置
在jsp文件中,只要是Java代码就会原封不动的输出,如果是HTML 代码,就会被转换为out.write("");像这样的代码
jsp中Java 的所有语法都支持
<% 作用:用来将程序的输出,输出到客户端 %> <%= 变量或者是表达式 %> <%= new java.util.Date()%>
jsp 脚本片段 <% int sum = 0; for(int i = 0;i <= 100;i++){ sum+= i; out.println("<h1>sum=" + sum + "</h1>"); } %>
jsp 声明 jsp 声明会被编译到jsp生成的java类中,其他的,就会被生成到jspService方法中 使用方法: <!% jsp 声明 %> JSP的注释不会在客户端显示 html 的注释会在客户端显示
在XML 中配置错误页面
<error-page> <error-code>404</error-code> <location>/</location> / 代表当前的项目 </error-page>
9大内置对象
PageContext 存东西 Reqquest 存东西 Response Session 存东西 Application 存东西 config out page exception
存东西的作用域
pagecontext 保存的数据只在一个页面中有效 request 保存的数据只在一次请求中有效 请求转发时会携带这个数据 session 保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器 application 保存的数据只在服务器中有效,从打开服务器到关闭服务器
EL 表达式的作用
获取数据
执行运算
获取web开发的常用对象
调用Java方法
jsp 标签 <jsp:forward page="jspPage2.jsp"> <jsp:param name="name" value="海洪健"></jsp:param> <jsp:param name="age" value="19"></jsp:param> </jsp:forward>
JSTL 标签库的使用就是为了弥补HTML标签的不足,他自定义了许多标签,可以供我们使用,标签的功能和java 代码一样
<form action="jstl.jsp" method="get"> <input type="text" name="username" ${param.username}><br/> <input type="password" name="pwd" ${param.pwd}><br/> <input type="submit" value="提交"> </form> <c:if test="${param.username == 'admin'}" var="isAdmin"> <c:out value="管理员欢迎你!" /> </c:if> <c:out value="${isAdmin}"/>
<c:set var="score" value="85"/> <c:choose> <c:when test="${score>=90}"> 你的成绩为优秀 </c:when> <c:when test="${score>=80}"> 你的成绩为良好 </c:when> <c:when test="${score>=60}"> 你的成绩为及格 </c:when> <c:when test="${score<60}"> 你的成绩为不及格 </c:when> </c:choose>
Java bean 必须有特定的写法
一般用来与数据库做映射
ORM :对象数据映射
表—> 类
字段–> 属性
行记录–> 对象
Model view Controller 模型 视图 控制器
早些年
目前项目开发(三层架构)
每层的主要功能
用来过滤网站的数据
常用场景: 登陆验证 乱码问题
也需要在web.xml 文件中配置 filter
<filter> <filter-name>filter</filter-name> <filter-class>com.hai.Filter.CharsetFilter</filter-class> </filter> <filter-mapping> <filter-name>filter</filter-name> <!-- servlet 下的所有请求都会执行过滤器--> <url-pattern>/servlet/*</url-pattern> </filter-mapping>
一个字符过滤器 // 初始化过滤器 // web服务器启动的时候就开始启动过滤器 // web服务器关闭的时候才会关闭过滤器 /// 可以在过滤器启动和关闭时来写一些日志 @Override public void init(FilterConfig filterConfig) throws ServletException { } // 过滤器做的事情 /* * Chain 链 * 1。过滤中的所有代码 在执行特定请求是都会执行 * 2.必须要让过滤器继续执行 * */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { servletRequest.setCharacterEncoding("utf-8"); servletResponse.setCharacterEncoding("utf-8"); servletResponse.setContentType("text/html;charset=UTF-8"); System.out.println("过滤器执行前"); // 让我们的请求继续走下去,如果不写,程序到这里就会停止 因为可能会有多个选择器 这是为其他选择器做准备 filterChain.doFilter(servletRequest,servletResponse); System.out.println("过滤器执行后"); } // 销毁过滤器 @Override public void destroy() { }
监听器也同这样需要注册
<!-- 注册监听器--> <listener> <listener-class>com.hai.listener.NumberListener</listener-class> </listener>
一个在线人数监听器
// session监听的创建 看你的一举一动 // 一旦创建session 就会出发这个事件 @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { // 获取servletContext 因为他的作用域最高 ServletContext ctx = httpSessionEvent.getSession().getServletContext(); // 获取在线人数 强制转换为包装类 Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount"); // 先进行判断 如果值为空 先进行创建 // 不为空 加一 if(onlineCount == null ) { onlineCount = new Integer(1); }else { // 先转换为普通数值类型 int count = onlineCount.intValue(); // 加一后再转换为包装类 onlineCount = new Integer(count+1); } ctx.setAttribute("OnlineCount",onlineCount); } // 补充: session的销毁方式 一是手动销毁 另外一种是设置过期时间 让session 自动销毁
在JSwing中会经常用到监听器和过滤器
GUI编程中经常使用
Java连接数据库
需要jar包的支持
8.0.25 数据库 连接 // MySQL 8.0 以下版本 - JDBC 驱动名及数据库 URL // static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; // static final String DB_URL = "jdbc:mysql://localhost:3306/RUNOOB"; //MySQL 8.0 以上版本 - JDBC 驱动名及数据库 URL static final String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; // 数据库的用户名与密码,需要根据自己的设置 static final String USER = "root"; static final String PASS = "123456"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ // 注册 JDBC 驱动 Class.forName(JDBC_DRIVER); // 打开链接 System.out.println("连接数据库..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); // 执行查询 System.out.println(" 实例化Statement对象..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, name, password FROM user"; ResultSet rs = stmt.executeQuery(sql); // 展开结果集数据库 while(rs.next()){ // 通过字段检索 int id = rs.getInt("id"); String name = rs.getString("name"); String password = rs.getString("password"); // 输出数据 System.out.println("ID: " + id); System.out.println("学生姓名: " + name); System.out.print("学生密码: " + password); System.out.print("\n"); } // 完成后关闭 rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ // 处理 JDBC 错误 se.printStackTrace(); }catch(Exception e){ // 处理 Class.forName 错误 e.printStackTrace(); }finally{ // 关闭资源 try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ }// 什么都不做 try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("Goodbye!"); }
删除操作
删除操作要用 executeLargeUpdate() 增删改都要用这个 会返回一个int类型的值 代表着受影响的行数 // 配置信息 String JDBC_DRIVER = "com.mysql.cj.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC"; String username = "root"; String password = "123456"; // 1.加载驱动 Class.forName(JDBC_DRIVER); // 2. 连接数据库 Connection connection = DriverManager.getConnection(url,username,password); // 3. 编写sql语句 String sql = "insert into jdbc.user(id,name,password,email,birthday) values(?,?,?,?,?)"; // 4. 预编译sql 语句 PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1,3);// 第一个占位符代表着第一个字符段存放的数据 preparedStatement.setString(2,"王五"); preparedStatement.setString(3,"123456"); preparedStatement.setString(4,"ww@qq.com"); preparedStatement.setString(5,"2003.5.1"); // 执行sql 语句 int i = preparedStatement.executeUpdate(sql); if(i > 0) { System.out.println("插入成功!"); } // 关闭资源 preparedStatement.close(); connection.close();
事务 要么成功 要不失败
事务提交:commit(); 事务回滚:
preparedStatement.setString(2,"王五"); preparedStatement.setString(3,"123456"); preparedStatement.setString(4,"ww@qq.com"); preparedStatement.setString(5,"2003.5.1"); // 执行sql 语句 int i = preparedStatement.executeUpdate(sql); if(i > 0) { System.out.println("插入成功!"); } // 关闭资源 preparedStatement.close(); connection.close();
## JDBC 事务 事务 要么成功 要不失败 ```java 事务提交:commit(); 事务回滚:
[外链图片转存中…(img-aHRaovXY-1633866502255)]