JavaWeb学习笔记02

JavaWebDay02

7.JSP

7.1什么JSP

Java Server Pages:java服务器端页面,也和Servlet一样,用于开发动态web

最大的特点:

  • 写JSP就像在写HTMl
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入java代码,为用户提供动态数据;

7.2JSP原理

思路:JSP到底怎么执行的!

  • 代码层面没有任何问题

  • 服务器内部工作

    Tomcat中有一个work目录;

    IDEA中使用Tomcat会在IDEA的Tomcat中产生一个work目录

浏览器向服务器发送请求,不管访问什么资源,其实就是在访问servlet!

JSP最终也会被转化为一个java类!

JSP本质就是一个Servlet !

    public void _jspInit() { };//初始化

    protected void _jspDestroy() {};//销毁

    public abstract void _jspService(HttpServletRequest var1, HttpServletResponse var2){}//JSP服务

1.判断请求

2.内置一些对象

final jakarta.servlet.jsp.PageContext pageContext;  //页面上下文
jakarta.servlet.http.HttpSession session=null;
final jakarta.servlet.ServletContext application;  
final jakarta.servlet.ServletConfig config;
jakarta.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
HttpServletRequest request;
HttpServletResponse response;

3.输出页面前增加的代码

response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, false, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      out = pageContext.getOut();
      _jspx_out = out;

4.以上的这些对象我们可以在JSP页面直接使用,在jsp中只要是java代码,都会原封不动的输出,而HTML代码会通过out.write()输出

7.3JSP基础语法

JSP语法在Java的基础上扩充了一些语法;同时支持所有的java语法

JSP表达式

<%--jsp表达式
作用:将程序的输出,输出到客户端
<%=变量名或者表达式%>
--%>
<%=new Date()%>

JSP脚本片段

<%--jsp脚本片段--%>
<%
    int sum = 0;
    for (int i = 1; i < 101; i++) {
        sum += i;
    }
    out.print("<h1>sum=" + sum + "<h1>");
%>

JSP声明

<%!java代码段%>            <%--此Java代码段在生成servlet的时候放在了类中,不是service方法中,<%%>中的代码段才是放在_jspService方法中--%>

7.4JSP指令、标签

<%@ page ...%>
<%--include指令会将多个页面合成一个,所以多个页面中的变量不能重名--%>
<%@include file=""%>
<%--include标签则是拼接页面,本质还是多个,只要保证单个页面中变量不要重名就行了--%>
<jsp:include page=""/>

7.5 、9大内置对象

  • PageContext

​ 只能在当前页面使用

  • Request

​ 客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

  • Response
  • Session

​ 客户端向服务器发送请求,产生的数据,用户用完,一会还有用,比如:购物车;

  • Application [ServletContext]

​ 客户端向服务器发送请求,产生的数据,一个用户用完,其他用户还可能使用,比如:聊天数据;

  • config [ServletConfig]
  • out
  • page 不用了解
  • exeception
<body>

<%--内置对象--%>
<%
    pageContext.setAttribute("name1","cjp1");  //保存的数据只在一个页面中有效
    request.setAttribute("name2","cjp2");  //保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","cjp3");  //再一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","cjp4");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>

<%
//通过pageContext取出我们保存的值
    String name1 = (String)pageContext.findAttribute("name1");
    String name2 = (String)pageContext.findAttribute("name2");
    String name3 = (String)pageContext.findAttribute("name3");
    String name4 = (String)pageContext.findAttribute("name4");
    String name5 = (String)pageContext.findAttribute("name5");
%>

<%--使用EL表达式输出${}--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>

当从另一个页面取这五个值时:只有name3和name4能取到

7.6、JSP标签、JSTL标签、EL表达式

EL表达式: ${}

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用java方法

JSP标签

//页面转发时设置参数
<jsp:forward page="forward2.jsp">
    <jsp:param name="name" value="曹久平"/>
    <jsp:param name="age" value="21"/>
</jsp:forward>
//获取参数
名字:<%=request.getParameter("name")%><br>
年龄:<%=request.getParameter("age")%>

JSTL表达式

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

使用前需要两个依赖:

       <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.1.2</version>
        </dependency>
        
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
  • 核心标签(掌握部分)
  • 格式化标签
  • SQL标签
  • xml标签

c:if

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page isELIgnored="false" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Hello</h1>
<form action="coreif.jsp" method="get">
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>
<c:if test="${param.username =='cjp'}" var="Iscjp">
    <c:out value="欢迎您!"/>
</c:if>
<c:out value="${Iscjp}"/>
</body>
</html>

c:choose、c:when

<c:set var="score" value="89"/>
<c:choose>
    <c:when test="${score>=90}">
        优秀
    </c:when>
    <c:when test="${score>=80}">
        良好
    </c:when>
    <c:when test="${score>=70}">
        一般
    </c:when>
    <c:when test="${score>=60}">
        及格
    </c:when>
</c:choose>

c:foreach

<%
    ArrayList<String> person = new ArrayList<>();
    person.add(0,"张三");
    person.add(1,"李四");
    person.add(2,"王伍");
    person.add(3,"赵六");
    person.add(4,"田七");
    request.setAttribute("list",person)
%>
<c:forEach var="person" items="${list}">
<c:out value="${person}"/> <br>
</c:forEach>

8.JavaBean

实体类

Javabean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set;

一般用来和数据库的字段做映射ORM;

ORM:对象关系映射

  • 数据库中的表对应java的一个类
  • 字段对应属性
  • 行记录–>类的对象

9、MVC三层架构

Model View Controller

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0t6ibxOL-1649487857769)(C:\Temp\1649226479120.png)]

  • 早些年,用户直接通过访问控制层来直接操作数据库;
servlet--->CRUD--->数据库
弊端:程序十分臃肿,不利于维护
servlet的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码

三层架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0pYgIFH-1649487857771)(C:\Temp\1649227304548.png)]

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(Dao)

view

  • 展示数据
  • 提供来连接发起servlet请求(a,form,img…)

Controller

  • 接收用户的请求:(request;请求参数、session信息…)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
登录->接收用户登录请求->处理用户的请求(获取用户登录参数 Username、password)->交给业务层处理登录业务(判断用户名、密码是否正确;事务)->Dao层查询数据库验证用户名或者密码是否正确->数据库

10.Filter(重点)

过滤器:用来过滤网站的数据

  • 处理中文乱码
  • 登录验证

Filter开发步骤:

  • 导包

  • 编写过滤器

    (1)导包不要错

    import jakarta.servlet.*;
    
    public class CharacterEncodingFilter implements Filter {
    
        //初始化:web服务器启动,他就初始化了,随时等待过滤对象
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("CharacterEncodingFilter已初始化!");
        }
        //Chain:链
        /*
        * 1.过滤中的所有代码,在过滤特定请求的时候都会执行
        * 2.必须要让过滤器继续通行
        * chain.doFilter(request,response);
         * */
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("utf-16");
            response.setCharacterEncoding("utf-16");
            response.setContentType("text/html;charset=UTF-16");
            System.out.println("CharacterEncodingFilter执行前。,。");
            chain.doFilter(request,response);  //让我们的请求继续走,如果不写,程序就只能执行到这里
            System.out.println("CharacterEncodingFilter执行后。,。");
        }
    
        //销毁:web服务器关闭的时候销毁
        public void destroy() {
            System.out.println("CharacterEncodingFilter已销毁!");
        }
    }
    

    web.xml中配置:

        <filter>
            <filter-name>filter1</filter-name>
            <filter class>com.cjp.filter.CharacterEncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>filter1</filter-name>
    <!--        只要是/servlet的任何请求,都会经过这个过滤器-->
            <url-pattern>/servlet/*</url-pattern>
        </filter-mapping>
    

11.监听器(listener)

实现一个监听器的接口(有N种)

回顾:session销毁的方式:

​ 一、自动销毁

<session-config>
  <session-timeout>10</session-timeout>
</session-config>

​ 二、手动销毁

<%session.invalidate();%>
  • 编写监听器(统计session个数)
package com.cjp.listener;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

public class SessionListener implements HttpSessionListener {
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext con =se.getSession().getServletContext();
        Integer onlineCount = (Integer) con.getAttribute("OnlineCount");
        if (onlineCount==null){
            onlineCount=new Integer(1);
        }else {
            int count = onlineCount.intValue();
            onlineCount=new Integer(count+1);
        }
        con.setAttribute("OnlineCount",onlineCount);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext con =se.getSession().getServletContext();
        Integer onlineCount = (Integer) con.getAttribute("OnlineCount");
        if (onlineCount==null){
            onlineCount=new Integer(0);
        }else {
            int count = onlineCount.intValue();
            onlineCount=new Integer(count-1);
        }
        con.setAttribute("OnlineCount",onlineCount);

    }
}

  • 在web.xml中注册监听器
 <listener>
    <listener-class>com.cjp.listener.SessionListener</listener-class>
  </listener>

12.过滤器、监听器常见应用

监听器在GUI中常用

过滤器:

用户登录之后才能进入主页,注销后就不能进入主页

1.用户登录后,向session中放入用户的数据

2.进入主页的时候要判断用户是否已经登录;在过滤器中实现

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request=(HttpServletRequest)servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        Object session_id = request.getSession().getAttribute("SESSION_ID");
        if (session_id==null){
            response.sendRedirect("/login.jsp");
        }

        filterChain.doFilter(servletRequest, servletResponse);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值