JavaEE

JavaEE下三大核心技术

Servlet:运行在JavaEE服务器中的Java程序

JSP本质上就是一个Servlet,只不过开发时看到的样子不同

Filter:过滤器,Servlet的一种补充,采用面向切面编程的思想,可以同时对多个页面进行相同的处理

  1. 监视一些动作或行为
    1. 对象的声明周期
      1. 创建
      2. 销毁
    2. 属性操作
      1. setAttribute
      2. removeAttribute
  2. 监视三种对象
    1. request对象
    2. session对象
    3. application对象

Listener:监听器,可以监听三大域对象request,session,application的生命周期以及属性变量

服务器容器:Tomcat,通过动态网页技术处理用户的请求

bin:执行文件

conf:配置

lib:库

logs:日志文件

temp:tomcat运行中的临时文件

webapps:网站

work:tomcat在运行过程中,生成的中间文件,存放JSP的中间文件

配置tomcat

新建一个JavaEE项目

Servlet编写一个动态网页

Servlet生命周期的三个方法

init

  • 只会执行一次
  • 当Servlet第一次被使用时,Tomcat容器就会创建这个Servlet对象,并且执行初始化方法
  • 以后再使用时,不需要创建了,直接使用第一次创建的对象即可(单例模式)

service

  • 当客户端发送一次请求,就会执行一次

destroy

  • 只会执行一次
  • 当服务器正常关闭/主动卸载Servlet时,才会被销毁

web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  version="2.5">
  <display-name>Demo0830</display-name>

  <!-- 当访问xxx/路径时,默认使用以下几个文件 -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>

  <!-- 配置Servlet -->
  <servlet>
    <servlet-name>testServlet</servlet-name>

    <!-- 类的全限定名:包名+类名 -->
    <servlet-class>com.situ.servlet.TestServlet</servlet-class>
  </servlet>
  <!-- 地址映射 -->
  <servlet-mapping>
    <!-- 名字 -->
    <servlet-name>testServlet</servlet-name>

    <!-- 访问规则 -->
    <url-pattern>/test</url-pattern>
    <url-pattern>/t</url-pattern>

  </servlet-mapping>
</web-app>
package com.situ.servlet;

import javax.servlet.*;
import java.io.IOException;
import java.util.Date;

/**
 * 变成一个Servlet->实现Servlet接口
 * 这个类创建好,只是可以作为一个Servlet使用
 *
 * 配置:告诉Tomcat,把这个类当成一个Servlet
 * 1.在web.xml中配置
 * 2.注解
 */
public class TestServlet implements Servlet{

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        //初始化Servlet

        System.out.println("初始化Servlet");
    }

    @Override
    public ServletConfig getServletConfig() {
        //获取Servlet中的配置信息,通常都在web.xml文件中
        return null;
    }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        //Servlet核心
        //用来响应客户端请求

        response.getWriter().write("Hello Servlet!!!");
        response.getWriter().write(new Date().toString());
    }

    @Override
    public String getServletInfo() {
        //获取Servlet信息
        return null;
    }

    @Override
    public void destroy() {
        //销毁Servlet中占用的资源

        System.out.println("销毁Servlet");
    }
}

HTTP的请求

Get和Post请求

Get请求

Get请求(默认请求方式)

包含:

  1. 在浏览器地址栏中输入地址,发送请求
  2. 超链接
  3. From表单默认请求方式
  4. Ajax技术下的默认请求方式

Post请求

Post请求(需要设置)

  1. 当Form表单的method属性设置为post时
  2. Ajax技术下,如果设置请求方式为post

Get和Post请求区别

  1. 传递参数的方式不同
    1. Get会将参数以?的形式拼接在URL的后面,多个参数使用&分隔
      url?参数1=值1&&参数2=值2
    2. Post会将参数通过负载形式向服务器发送数据
  2. 参数类型不同
    1. Get只能发送字符串类型的数据
    2. Post不仅可以发送字符串类型的,还可以发送二进制的(eg:文件)
  3. 参数的长度不同
    1. Get请求的参数,受限于URL长度的限制,不同浏览器要求不一样
    2. Post请求可以分段传送数据,可以提交很大的参数,只要服务器允许
  4. 安全性不同
    1. Get请求方式会暴露明文,安全性低
    2. Post数据会隐藏,安全性略高
package com.situ.servlet;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * HttpServlet的子类
 *
 */
@WebServlet("/Test2Servlet")    //web3.0开始,Servlet可以使用注解进行配置
//修改了了web.xml或者是注释上的配置信息,必须重新启动加载
public class Test2Servlet extends HttpServlet {

    //序列化时版本号
    private static final long serialVersionUID = 1L;
    public Test2Servlet(){
        super();
    }

    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //处理get类型的请求
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    protected void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
        //处理Post类型的请求

        //默认情况下,doPost会调用doGet,不管get还是post请求,都由doGet方法来处理
        doGet(request,response);
    }
}

用户登录实现

<%--
  Created by IntelliJ IDEA.
  User: 20506
  Date: 2024/3/10
  Time: 20:29
  To change this template use File | Settings | File Templates.
  --%>
  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>用户登录</title>
      </head>
      <body>
        <h1>用户登录</h1>
        <form action="login" method="post">
          账号:<input type="text" name="username"><br>
          密码:<input type="password" name="password"><br>
          <input type="submit" value="登录">
          ${error}    <!-- EL表达式,显示request对象中的error属性值 -->

        </form>

      </body>
    </html>
<%--
  Created by IntelliJ IDEA.
  User: 20506
  Date: 2024/3/10
  Time: 20:44
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录成功</title>
</head>
<body>
    <h1>登录成功</h1>
</body>
</html>
package com.situ.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.获取参数:账号和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");

        // 2.处理业务:验证账号和密码是否正确
        if("tom".equals(username) && "123".equals(password)){
            //登录成功
            //3.返回数据:跳转页面
            // 重定向
            resp.sendRedirect("success.jsp");
        } else {
            //登录失败
            //3.返回数据:跳转页面
            //账号或密码不正确
            req.setAttribute("error","账号或密码错误");

            //返回登录页面
            //请求转发
            req.getRequestDispatcher("login.jsp").forward(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req,resp);
    }
}

访问服务器的基本过程

重定向的实现过程

请求转发的实现方式

请求转发和重定向的区别

  1. 请求转发是服务器内部的行为,重定向是服务器指挥客户端请求新的页面
  2. 请求转发只有一次请求,多个页面会共享同一对requesthe response对象,重定向会发送两次请求,两次请求都会生成新的request和response对象
  3. 请求转发可以使用request对象实现几个页面中数据的共享,重定向不能使用request共享数据
  4. 请求转发地址栏不会变化,重定向会修改地址栏到跳转页面

什么时候使用请求转发和重定向

跳转页面之间需要进行数据共享时,使用请求转发,否则使用重定向

JSP

Java Server Page

  1. 静态代码:html,css,js
  2. 指令标签:page,include,taglib
  3. 动作标签:out,forward(请求转发),include,param…
  4. 内嵌Java代码
  5. EL表达式
  6. JSTL

九大内置对象,四大作用域

指令标签

<%@ 标签名 属性 %>

Page

<%@ page %>设置当前页面的相关属性

  1. Language:语言
  2. contentType:当前页面的内容类型
    1. 相当于response.setContentType();
  3. pageEncoding:当前页面的保存时的编码格式
  4. import:引入外部的类
  5. isErrorPage:设置成true,是一种错误处理页面,可以使用exception对象,可以看到错误信息,默认值是false
  6. errorPage:指定当前页面抛出异常时的处理页面
    <font style="color:#080808;background-color:#ffffff;"><%=exception%></font>

include

静态地引入一个外部的页面,相当于将外部页面的代码复制到当前页面中再翻译,编译,执行

<%@ include file="外部页面" %>

taglib

引入自定义标签库

<%@taglib prefix="前缀" uri="xxx" %>

比如在xxx里定义一个自定义的标签t

<前缀:t></前缀:t>

使用JSTL时

动作标签

<jsp:标签名 ></jsp:标签名>

forward

请求转发

<jsp:forward page="页面"></jsp:forward>

作用相当于request.getRequestDispatcher("success.jsp").forward(request,response);

include

动态地引入一个外部页面,两个页面会分别翻译,编译,执行

只是将外部页面执行结果添加到当前页面的执行结果中

动态引入是在执行时引入的

<jsp:include page="页面"></jsp:include>

静态引入和动态引入的区别
  1. 静态引入是先引入再翻译,编译JSP文件,动态引入是执行时,将外部页面的执行结果加入到当前页面
  2. 静态引入只会生成一个文件,动态引入分别生成单独的文件
  3. 静态引入执行效率高,动态页面灵活性更高

param

为forward和include添加参数

<jsp:include page="需要添加的页面">
  <jsp:param name="xxx" value="xxx"/>
</jsp:include>

内嵌Java代码

Java片段

<% 像在Java的方法中编写代码 %>

不能定义方法,变量也都是局部变量

输出表达式

<%= Java表达式 %>

计算表达式的值,并且输出到当前页面中

声明片段

<%! 定义全局的变量,方法 %>

可以像定义类的属性和方法一样编写代码

定义的全局变量实际上是当前JSP类的成员变量

JSP执行过程

九大内置对象和四大作用域

九大内置对象

在JSP页面中可以直接使用的对象:

request

请求对象,封装携带来自客户端的数据

HttpServletRequest类型的

request.getParameter("参数名");
request.getSession();
request.getServletContext();
request.getRequestDispatcher("xxx").forward(request,response)
request.setAttribute("属性名","属性值");
request.getAttribute("属性名");
request.removeAttribute("属性名");

response

响应对象

HttpServletResponse类型

response.getWriter();
response.setContentType();
response.sendRedirect("xxx");

session

会话对象

在一段时间内,客户端浏览器与服务器之间的连续多次请求

会话可以实现多次请求之间的数据共享

session.setAttribute("属性名","属性值");
session.getAttribute("属性名");
session.removeAttrebute("属性名");

Session作用的范围有多大:

一个会话中可以包含多次请求

终止会话的情况:1.同一台电脑,不同的浏览器,请求不在同一会话中;2.同一个浏览器打开再关闭,会创建新的会话;3.同一个浏览器,不关闭,如果长时间不访问,服务器会关闭这个会话(Tomcat默认的Session超时时间是30分钟,可以修改);4.在Session对象上调用invalidate(),当前的Session对象会主动销毁

<session-config>
  <session-timeout>1</session-timeout>
  <!-- 设置必须为整数,如果设置为0及以下,session永不超时 -->
</session-config>

服务器如何知道两个请求属于同一个Session?

通过Cookie

Session 是基于 Cookie 实现的

session对象的生命周期
  1. 创建:客户端发送请求访问服务器,主动申请session时会创建session对象
  2. 销毁:
    1. 主动销毁:安全退出,执行代码让session失效
session.invalidate();
2. 超时:最后一次有效访问服务器后30分钟内仔没有和服务器有任何的交互,服务器会将超时的session销毁
3. 

application

应用程序对象,对应在Tomcat运行的一个项目

数据类型:ServletContext类型(Servlet上下文)->Servlet的容器

可以实现不同会话之间的数据共享

application.setAttribute("属性名",属性值);
application.getAttribute("属性名");
application.removeAttribute("属性名");

page

代表当前JSP页面(xxx_jsp类的对象)

pageContext

当前页面上下文

可以获取其他8个内置对象

config

当前页面的配置信息,基本上没有用

out

输出流/输出对象,写道response中,向客户端返回

可以向JSP中输出内容

exception

异常对象,这个对象只存在于错误处理页面(isErrorPage=“true”)

异常对象是由上一个页面抛出的

四大作用域

page

作用域范围为当前JSP页面

page,pageContext,config,out,exception

request

作用域范围为本次请求

request,response

session

作用域范围为本次会话

session

application

作用域范围为本次应用运行

application

token:不会保存在服务器内存中,分布式服务器登录

  1. 应当尽量使用作用域范围更小的对象
  2. Session中尽量少放东西

EL和JSTL

EL表达式

默认会按照request,session,application访问属性

EL表达式是JSP中的表达式语言

作用:简化JSP页面中的输出操作

JSP中的输出操作:

  1. out.write();
  2. out.append();
  3. out.print();
  4. <%= Java表达式 %>
<%@ page import="com.situ.entity.User" %><%--
  Created by IntelliJ IDEA.
  User: 20506
  Date: 2024/3/16
  Time: 11:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" import="com.situ.entity.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String a = "输出信息";
    %>

    <%
        out.write(a);
    %>

    <%= a %>    <br>

    <%
        request.setAttribute("info","request中的数据");
        session.setAttribute("info","session中的数据");
        application.setAttribute("info","application中的数据");

        //实体类类型
        User user = new User();
        user.setUsername("tom");
        user.setPassword("123");
        request.setAttribute("user",user);

        String[] arr = {"Java","HTML","MySQL"};
        request.setAttribute("arr",arr);

        List<String> list = new ArrayList<>();
        list.add("aaa");
        list.add("bbb");
        list.add("ccc");

        request.setAttribute("list",list);
    %>

    <%= request.getAttribute("info") %>     <br>
    <%= session.getAttribute("info")%>      <br>
    <%= application.getAttribute("info")%>  <br>

    <%
        out.write(request.getAttribute("info").toString());
        out.write(session.getAttribute("info").toString());
        out.write(application.getAttribute("info").toString());
    %>

    <br>
    EL表达式操作
    <br>
    ${info} <br>
    ${requestScope.info}    <br>
    ${sessionScope.info}    <br>
    ${applicationScope.info}<br>
    ${param.info}   <br>    <!--访问参数中的info -->
    <!--访问实体类对象 -->
    ${user.toString()}  <br>
    ${user.username}    调用user.getUsername()<br>
    ${user.password}    调用user.getPassword()<br>

    ${arr}   <br>

    ${list} <br>

    <!-- 根据条件显示不同的内容 -->
    <%
        int score=80;
        if (score>60){
            out.print("及格");
        }
    %>
</body>
</html>

JSTL

Java标准标签库

可以像JSP动作标签一样使用

JSTL包含:

  1. core:14个标签,if,foreach…
  2. fmt:格式化操作
  3. function:提供了常用的处理方法
  4. xml:XML文件解析
  5. sql:SQL操作数据库

使用taglib引入JSTL的库

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

core

<!-- 引入JSTL -->
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:if test="true">  <!-- 还可以使用el表达式例如${requestScope.info != null} -->
    条件成立
</c:if>
<c:if test="false">
    条件不成立
</c:if>

<c:choose>
    <c:when test="${10<5}">
        条件不成立
    </c:when>
    <c:when test="${10<5}">
        条件不成立
    </c:when>
    <c:otherwise>
        条件都不成立
    </c:otherwise>
</c:choose>

<!-- 遍历集合 -->
<c:forEach items="${list}" var="l">
    ${l}
</c:forEach>

请求保持技术

Session

会话对象

在一段时间内,客户端浏览器与服务器之间的多次请求

将用户信息保存在服务器中,可以保存很多不同类型的数据,

会话可以实现多次请求之间的数据共享

session.setAttribute("属性名","属性值");
session.getAttribute("属性名");
session.removeAttrebute("属性名");

Session作用的范围有多大:

一个会话中可以包含多次请求

终止会话的情况:1.同一台电脑,不同的浏览器,请求不在同一会话中;2.同一个浏览器打开再关闭,会创建新的会话;3.同一个浏览器,不关闭,如果长时间不访问,服务器会关闭这个会话(Tomcat默认的Session超时时间是30分钟,可以修改);4.在Session对象上调用invalidate(),当前的Session对象会主动销毁

<session-config>
  <session-timeout>1</session-timeout>
</session-config>

服务器如何知道两个请求属于同一个Session?

通过Cookie

Session 是基于 Cookie 实现的,使用cookie保存SessionID

Cookie

浏览器数据保存的功能,不会给服务器增加负担,安全性低

只能保存字符串,也不能太多

token

数据保存在浏览器中,保存方式可以使用cookie,也可以使用sessionStorage,还可以使用localStorage

对用户信息进行加密的字符串

可以用在分布式环境下

JSP+Servlet

项目架构

Model 1

所有的东西都写在JSP中

JSP只负责显示页面

所有与逻辑相关的东西都放在Servlet中

登录功能:JSP负责提供表单,点击登录时请求发送给Servlet,调用数据库查询,跳转页面

当业务越来越复杂时,Servlet中代码就会越来越复杂

Model 2

JSP+Servlet+Model层

Servlet只负责接收请求,调用Model层,返回页面

Web三层架构

由MVC三层架构演化而来

M:Model 模型

逻辑模型:用来保存数据的类,实体类

逻辑模型:处理逻辑的,Dao层,业务模型

V:View 视图

提供人机交互的界面,通常是JSP

C:Controller 控制层

协调管理V与M之间的相互联系,通常由Servlet完成

Web的三层架构是指Servlet,Service,Dao层

创建项目

  1. 创建项目
  2. 导入需要的第三方jar包

<%
String basePath = request.getScheme() +"://"
+request.getServerName() +":"
+request.getServerPort()
+request.getContextPath() +"/";
%>

实体类创建规则:

1.实体类的类名与数据表的表名一致

2.实体类的属性与数据表字段一致

  属性名与字段名一致

  属性数据类型与字段数据类型一致(使用包装类,java.util.Date)

3.属性私有化,提供公共的Get和Set方法

4.实体类应该有一个无参的构造方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还能做什么

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值