Java教程

JavaWeb

本文主要是介绍JavaWeb,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

JavaWeb

所有笔记均为笔者网课所记笔记。如有侵权,联系必删。如果错误,一定改正。

Response重定向

客户端收到一个不是他的请求后,去通知另外一个客户端资源的过程叫做重定向。

常用场景:用户登录

image-20210919110327763

通过设置响应头 响应的状态码 或者直接使用重定向的方法

重定向和转发之间的区别

相同点:页面都会实现跳转

不同点:请求转发时 url地址栏不会发生变化
重定向页面跳转时地址栏也会发生变化

Request应用

HttpServletRequest代表客户端,通过HTTP协议访问服务器,并且将返回的信息封装到

HttpServletRequest,通过HttpServletRequest的方法,获得客户端的所有信息。

获取前端传递的参数

image-20210919145834166

Cookie讲解

会话:用户从打开浏览器到关闭浏览器之间的操作叫做一次会话

image-20210919151350891

保存会话的两种技术

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
  1. 一个Cookie只能保存一个信息
  2. 一个web站点可以给浏览器发送多个cookie
  3. 一个站点最多存放20个
  4. Cookie的大小限制为4kb

删除cookie的方法

  1. 不设置有效期 关闭浏览器 自动删除

  2. 设置有效期时间为0

  3. 创建一个 cookie ,与要删除的cookie名字相同

image-20210919162657062

编码类

encode 编码 decode 解码

session(重点)

session 是服务端技术

服务器会给每一位用户(浏览器)创建一个session 对象

一个session 独占整个浏览器,只要浏览器没有关闭, 这个session 就存在

用户登录之后,整个网站它都可以访问

我们也可以手动给session 设置有效时间 在web.xml 中设置session 的有效时间

image-20210920192203736

cookie和session 之间的区别
   1. cookie是把用户的数据写到用户的浏览器中,浏览器保存(可以保存多个) 
   2. Session 把用户的数据写到用户独占的Session 中,服务器端保存(服务器端主要用来保存重要信息,减少对服务器资源的浪费)
   3.session 对象由服务创建
 
   主要使用场景:
    保存一个登录用户的信息
    购物车信息
    在整个网站中经常会看到使用的数据,我们将他保存在session 中
    
    注销session  
    session.invalidate();

Jsp原理

什么是JSP

Java Server Pages: java服务器端的页面 也和servlet 一样,用于动态

JSP 原理

jsp本质上就是一个servlet

jsp中封装了很多的函数和内置

image-20210920202445624

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>

jsp内置对象以及作用域

9大内置对象

PageContext  存东西
Reqquest   存东西
Response  
Session   存东西
Application  存东西
config
out
page
exception

存东西的作用域

pagecontext  保存的数据只在一个页面中有效
request  保存的数据只在一次请求中有效  请求转发时会携带这个数据
session  保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application 保存的数据只在服务器中有效,从打开服务器到关闭服务器

image-20210921190949626

image-20210921191450697

JSP JSTL 标签 EL 表达式

EL 表达式的作用

  1. 获取数据

  2. 执行运算

  3. 获取web开发的常用对象

  4. 调用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 表达式

JSTL 标签库的使用就是为了弥补HTML标签的不足,他自定义了许多标签,可以供我们使用,标签的功能和java 代码一样

核心标签

image-20210921194301382

c: if 标签

<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 标签

<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及作业(实体类)

Java bean 必须有特定的写法

  1. 必须要有一个无参构造
  2. 属性必须私有化
  3. 必须有对应的get/set方法

一般用来与数据库做映射

ORM :对象数据映射

表—> 类

字段–> 属性

行记录–> 对象

MVC三层架构

Model view Controller 模型 视图 控制器

早些年

image-20210922155735421

image-20210922162757742

目前项目开发(三层架构)

image-20210922162729839

每层的主要功能

image-20210922163109523

过滤器Filter

用来过滤网站的数据

常用场景: 登陆验证 乱码问题

image-20210922163415789

Filter开发步骤

  1. 导包
  2. 编写过滤器

也需要在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编程中经常使用

JDBC 复习

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();

JDBC 事务

事务 要么成功 要不失败

事务提交:commit();
事务回滚: 

image-20210923194402751

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)]

这篇关于JavaWeb的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!