Web期末复习 —— Servlet 和 JSP

前言

  • Web服务器
    Apache
    IIS
    Nginx

在这里插入图片描述
当在一台机器上配置好Apache 服务器,可利用它响应HTML页面的访问请求。

  • 服务器端编程技术
    在服务器端要实现Web应用的动态功能,需要服务器端编程技术。
    目前,在服务器端技术有多种,包括
    • CGI技术、
    • Servlet技术
    • 动态页面技术。
      PHP, JSP,ASP

Servlet

Servlet 是运行在 Web 服务器或应用服务器上的程序。
它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。

  • 使用 Servlet
    收集来自网页表单的用户输入,
    呈现来自数据库或者其他源的记录,
    还可以动态创建网页。
  • 是Java开发Web应用的底层技术。

在Java平台上,服务器扩展是使用Servlet API编写的,
服务器扩展模块叫做Servlet容器(container),或称Web容器

  • TOMCAT就是一个Web容器

  • 由于大部分Servlet应用都包含多个JSP页面,因此更准确地说是“Servlet/JSP应用”。

在这里插入图片描述

Servlet API

Servlet API定义了若干接口和类,它由下面4个包组成。

  • javax.servlet
    定义了开发与协议无关的Servlet的接口和类

  • javax.servlet.http
    定义了HTTP协议创建的Servlet所需要的的接口和类

  • javax.servlet.annotation
    包含标注Servlet、Filter、Listener的标注。
    它还为被标注元件定义元数据

  • javax.servlet.descriptor
    包含提供程序化登录web应用程序的配置信息的类型

  • javax.servlet.Servlet接口是Servlet API中的基本接口,
    Servlet技术的核心是Servlet接口
    每个Servlet必须直接或间接实现该接口。

其中service(request,response)尤为值得关心。

void init(ServletConfig config)
void service(ServletRequest request,  ServletResponse response)
void destroy()
ServletConfig getServletConfig()
String getServletInfo()

Servlet中的抽象类

  • javax.servlet.GenericServlet抽象类
    它实现了Servlet接口和ServletConfig接口。
    可以继承GenericServlet类并实现service()方法来创建任何类型的Servlet。

  • HttpServlet
    HttpServlet抽象类继承了GenericServlet类,
    它用来实现针对HTTP协议的Servlet,
    在HttpServlet类中增加了一个新的service()方法。

  • 在HttpServlet中针对不同的HTTP请求方法定义了不同的处理方法。
    get方法:

public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
            throws ServletException, IOException {
    }

当然还有post方法:

处理Http请求

  • 在HttpServlet中对每种HTTP方法定义了相应的方法
    在这里插入图片描述
 protected void doGet(HttpServletRequest request, 
	HttpServletResponse response) throws ServletException, IOException;  
  • 检索请求参数
    请求参数是随请求一起发送到服务器的数据,它以“名/值”对的形式发送。

    • POST请求,参数在数据区;
    • GET请求,参数附加在URI后面。
  • 客户端传递参数方式

从客户端向服务器端传递请求参数有下面两种方法。

  • 通过表单指定请求参数,每个表单域可以传递一个请求参数,这种方法适用于GET请求和POST请求。
  • 通过URL中的查询串指定请求参数,将参数名和值附加在请求URI后面,这种方法只适用于GET请求

问号后面内容称为查询串(query string),为请求参数名和参数值对。
若有多个参数,中间用“&”符号分隔,参数名和参数值之间用等号(=)分隔。
如:http://localhost:8080/chapter02/user- login?username=admin&password=admin

  • 使用请求对象存储数据
    可使用请求对象HttpServletRequest存储数据。
    请求对象是一个作用域对象,可以在其上存储属性实现数据共享。
    • 属性(attribute)包括属性名和属性值。
      属性名是一个字符串,
      属性值是一个对象。

有关属性存储的方法有4个,定义在HttpServletRequest接口中。
格式如下。

    public void setAttribute(String name,Object obj)
    public Object getAttribute(String name)   
要类型转换
     public void removeAttribute(String name)
    public Enumeration getAttributeNames() 

处理表单

  • 文本、单选按钮,使用String data = request.getParameter(String name)
  • 复选框、多选框,使用String[] data = request.getParameterValues(name)

请求转发与响应重定向

  • 请求转发
    request.getRequestDispatcher().forward(request,response)
    不能转向到本web应用之外的页面和网站,所以转向的速度要快。

  • 响应重定向
    通过响应对象response的sendRedirect()实现,public void sendRedirect(String location)
    注:URL可以是绝对URL(如https://www.baidu.com),也可以是相对URL。

  • 一个猜数字的小栗子

package com.jsy.learn;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

// URL为:http://localhost:8080/learnServletAndJSP_war_exploded/GuessNumberServlet 执行

@WebServlet("/GuessNumberServlet")
public class GuessNumberServlet extends HttpServlet {
    @Override
    public void doGet(HttpServletRequest request,
                      HttpServletResponse response)
            throws ServletException, IOException
    {
        
        int magic = (int)(Math.random()*101);
        HttpSession session = request.getSession();
        // 浏览器第一次访问,服务器就产生一个 session 会话,产生一个随机数存在session里。
        session.setAttribute("num",new Integer(magic));
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 输出 表单
        out.println("<html><body>");
        out.println("guess a number between 0 and 100");
        out.println("<form action='/learnServletAndJSP_war_exploded/GuessNumberServlet' method='post'>");
        out.println("<input type='text' name='guess' />");
        out.println("<input type='submit' value='submit'/>");
        out.println("</form>");
        out.println("</body></html>");
    }


    @Override
    public void doPost(HttpServletRequest request,
                       HttpServletResponse response)
            throws ServletException, IOException
    {
        // 表单通过 post函数传来值
        int guess = Integer.parseInt(request.getParameter("guess"));
        // 这里通过 request 获得的session 就是 一开始上面存在服务器的session
        HttpSession session = request.getSession();
        // 获取一开始设定的值
        int magic = (Integer)session.getAttribute("num");

        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        // 写判断逻辑
        if(guess==magic){
            // 会话失效,当然之前一开始设置的值也就失效了
            session.invalidate();
            out.println("ok!");
            out.println("<a href = '/learnServletAndJSP_war_exploded/GuessNumberServlet'>again?.</a>");
        }
        else if(guess>magic){
            out.println("It's too big!");
        }
        else{
            out.println("It's too small!");
        }
        out.println("<form action='/learnServletAndJSP_war_exploded/GuessNumberServlet' method='post'>");
        out.println("<input type='text' name='guess' />");
        out.println("<input type='submit' value='submit'/>");
        out.println("</form>");
        out.println("</body></html>");
    }
}

JSP

概念

  • JSP(JavaServer Pages)是一种在HTML页面中嵌入JSP元素的动态Web页面 ,它的主要用来实现表示逻辑。

在JSP页面中可以包含多种JSP元素,当JSP页面被访问时,Web容器将JSP页面转换成Servlet类执行后将结果发送给客户。

  • JSP文件会被转换和编译成Servlet程序。

与其他的Web页面一样,JSP页面也有一个唯一的URL,客户可以通过它访问该页面。

语法

在JSP页面中可以使用三种脚本元素:

  • JSP声明、

  • JSP小脚本、

  • JSP表达式。

  • 变量(类的成员变量、)、方法(类的成员方法)的声明

<%!  %>
  • 表达式,插值
<%= %>
  • 指令
<%@ %>

如:
<%-- 导包 --%>
<%@ page import="java.time.LocalDate" %>

<%@ include attribute-list %>
在JSP 编译时插入一个包含文本或代码的文件,这个包含的过程是静态的,
  • 脚本(service的中的方法代码段)
<% %>

生命周期

当JSP页面第一次被访问时,Web容器解析JSP文件并将其转换成相应的Java文件,该文件声明了一个Servlet类,该类称为页面实现类。

在这里插入图片描述

客户首次访问页面时,Web容器执行该JSP页面要经过6个阶段。

  • 前三个阶段将JSP页面转换成一个Servlet类并装载和创建该类实例;
  • 后三个阶段是初始化、提供服务和销毁阶段。

各种小例子

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%-- 导包 --%>
<%@ page import="java.time.LocalDate" %>

<%! LocalDate curDate = null;%>

<html>
<head>
    <title>当前日期</title>
</head>
<body>

<% curDate = LocalDate.now(); %>

今天的日期是:<%= curDate.toString() %>

</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


<%-- 变量声明的顺序无关紧要,因为都会转换为实现类的成员变量和成员方法 --%>
<%!
    double r;

    double getArea(double r) {
        return Math.PI * r * r;
    }
%>

<html>
<head>
    <title>圆的面积</title>
</head>

<body>

<%
    out.println("欢迎");
%>

<%
    String s = request.getParameter("radius");
    if (s == null) s = "0";
    r = Double.parseDouble(s);
%>

<div>
    <form action="circle_area.jsp" method="post">
        <input type="text" name="radius"/>
        <input type="submit" value="点我提交"/>
    </form>
</div>

<div>
    半径为<%= r %>的圆的面积为:<%= getArea(r)%>
</div>

</body>
</html>
  • JSP的循环
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>计算平方根</title>
</head>
<body>
<table border="1">
    <%
        for(int i=1;i<10;i++){
    %>
    <tr>
        <td><%= i%></td>
        <td><%= Math.sqrt(i)%></td>
    </tr>
    <%
        }
    %>
</table>
</body>
</html>

JSP隐含变量

out

out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。
可以在小脚本中直接使用它,也可以在表达式中间接使用它产生HTML代码。

out.print();
out.println();
out.write();

request

该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等。
分析用户请求。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<html>
<head>
    <title>隐含变量request</title>
</head>
<body>
请求URI为 <%=  request.getRequestURI() %><br>
请求全路径 <%=  request.getRequestURL() %><br>
请求方法为 <%= request.getMethod() %><br>
协议为 <%= request.getProtocol() %>><br>
</body>
</html>
  • 根据 URL传递参数
    注意两种方式的不同。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>get和Post的区别</title>
</head>
<body>


<form action="get_post.jsp" method="post">
    <input type="text" name="your_name">
    <input type="submit" value="post提交">
</form>

<form action="get_post.jsp" method="get">
    <input type="text" name="your_name">
    <input type="submit" value="get提交">
</form>

<%! String name = null;%>

<%
    name = request.getParameter("your_name");
%>

你的姓名<%= name %>
</body>
</html>

response

response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。
向用户发送响应。
可以设置一些cookie。

session

在session里单独细讲。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值