Servlet 基础知识学习

Servlet学习笔记

Servlet 简介

Servlet 是运行在 Web 服务器端的 Java 应用程序,它使用 Java 语言编写,具有 Java 语言的优点。与 Java 程序的区别是,Servlet 对象主要封装了对 HTTP 请求的处理,并且它的运行需要 Servlet 容器(tomcat)的支持,在 Java Web 应用方面,Servlet 的应用占有十分重要的地位,它在 Web 请求的处理功能方面也非常强大。

Servlet 的创建十分简单,创建一个普通的 Java 类,使这个类继承 HttpServlet 类并根据需要重写父类的 doGet()或 doPost()方法,再通过手动配置 web.xml 文件注册 Servlet 对象,以告知 Web 容器哪一个请求调用哪一个 Servlet 对象处理。

Servlet 的配置包含在 web.xml文件中,主要通过以下两步进行设置。

<!--声明Servlet-->
<servlet>
    <servlet-name>MyServlet</servlet-name>
    <servlet-class>cn.hx.MyServlet</servlet-class>
</servlet>
<!--映射Servlet-->
<servlet-mapping>
    <servlet-name>MyServlet</servlet-name>
    <url-pattern>/my</url-pattern>
</servlet-mapping>

声明 Servlet 对象在 web.xml 文件中,通过标签声明一个 Servlet 对象。在此标签下包含两个主要子元素,分别为与 其中,元素用于指定 Servlet 的名称,该名称可以为自定义的名称;元素用于指定 Servlet 对象的完整位置,包含 Servlet 对象的包名与类名。

在 web.xml 文件中声明了 Servlet 对象后,需要映射访问 Servlet 的 URL 该操作使用标签进行配置。标签包含两个子元素,分别为与。其中,元素与标签中的元素相对应,不可以随意命名。元素用于映射访问 URL。

案例:将 jsp 页面的登录过程用 Servlet 实现一下

public class LoginServlet extends HttpServlet {
   

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
   
       doPost(rep, resp);
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");        
        if ("admin".equals(name) &amp;&amp; "123".equals(pwd)){
   
            request.getSession().setAttribute("user",login);
            response.sendRedirect("index.jsp");
        }else {
   
            response.sendRedirect("login.jsp");
        }
    }
}

案例:Servlet 直接向浏览器响应 HTML 字符串

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;
import java.io.PrintWriter;

public class TestServlet extends HttpServlet {
   
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        PrintWriter writer = response.getWriter();
        writer.write("<h1>hello world!</h1>");
    }
}

Servlet 是使用 Java Servlet 接口运行在 Web 应用服务器上的 Java 程序,其功能十分强大,它不但可以处理 HTTP 请求中的业务逻辑,而且还可以输出 HTML 代码来显示指定页面。而 JSP 是一 种在 Servlet 规范之上的动态网页技术,在 JSP 页面中,同样可以编写业务逻辑处理 HTTP 请求,也可以通过 HTML 代码来编辑页面,在实现功能上,Servlet 与 JSP 貌似相同,实质存在一定的区别,主要表现在以下几方面。

  1. 角色不同:JSP 页面可以存在 HTML 代码与 Java 代码并存的情况,而 Servlet 需要承担客户请求与业务处理的中间角色,只有调用固定的方法才能将动态内容输出为静态的 HTML,所以,JSP 更具有显示层的角色。
  2. 编程方法不同:Servlet 与 JSP 在编程方法上存在很大的区别,使用 Servlet 开发 Web 应用程序需要遵循 Java 的标准,而 JSP 需要遵循一定脚本语言规范。
  3. Servlet 需要编译后运行:Servlet 需要在 Java 编译器编译后才可以运行,如果 Servlet 在编写完成或修改后没有被重新编译, 则不能运行在 Web 容器中。而 JSP 则与之相反,JSP 由 JSP Container 对其进行管理,它的编辑过程也由 JSP Container 对 JSP 进行自动编译,所以,无论 JSP 文件被创建还是修改,都不需要对其编译即可运行。
  4. 速度不同:由于 JSP 页面由 JSP Container 对其进行管理,在每次执行不同内容的动态 JSP 页面时,JSP Container 都要对其自动编译,所以,它的效率低于 Servlet 的执行效率。而 Servlet 在编译完成之后,则不需要再次编译,可以直接获取及输出动态内容。在 JSP 页面中的内容没有变化的情况下,JSP 页面的编译完成之后,JSP Container 不会再次对 JSP 进行编译。

注意:在响应过程中如果出现中文乱码,需要设置 response.setCharacterEncoding(“UTF-8”);和 response.setContentType(“text/html;charset=UTF-8”);关于请求的方法,点击 a 标签跳转,或直接在浏览器地址栏输入地址并回车,这样的请求方式是 get 请求。post 请求一般有表单提交且表单指定请求方式为 post 或者 ajax 请求。

练习:

1.注册校验练习:创建项目 demo3 并编写一个注册模块,注册页 register.jsp,jsp 里面有 username,password,repsssword,telephone。提交之后转到 servlet。servlet 判断 password 与 repassword 是否相同和电话号码为 11 位。如果都符合,显示"注册成功"。否则显示"密码与确认密码不一致或手机号不合法"。

参考代码:

register.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>注册</title>
</head>
<body>
<form action="register" method="post">
    <input name="username"/>
    <br/>
    <input name="password"/>
    <br/>
    <input name="repassword"/>
    <br/>
    <input name="telephone"/>
    <br/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

RegisterServlet

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

public class RegisterServlet extends HttpServlet {
   
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        response.setCharacterEncoding("utf-8");
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String repassword = request.getParameter("repassword");
        String telephone = request.getParameter("telephone");
        if (repassword != null &amp;&amp; repassword.equals(password) &amp;&amp; telephone != null &amp;&amp; telephone.length() == 11) {
   
            response.getWriter().write("<h1>注册成功</h1>");
            return;
        }
        response.getWriter().write("<h1>密码与确认密码不一致或手机号不合法</h1>");
    }
}

重定向与转发

重定向表示当前访问的资源没有权限获取操作成功后需要浏览器跳转到指定的 jsp 或 servlet,这种跳转是由于后台返回了一个 code 为 302 的响应头,并且在响应头中告知浏览器跳转地址。浏览器主动跳转。 使用如下语法即可完成重定向:

response.sendRedirect("login.jsp");

转发是描述 jsp 与 servlet 之间的关系,该转发的逻辑如下,当我们访问 jsp页面时,页面没有相关的数据展示,于是我们的请求便指向 servlet 的地址,servlet 调用相关组件获取数据,然后将数据存入 request 中,jsp 页面再将 request 中的数据渲染出一张有数据的 html 页面。这样各司其职也正是 java 提出的高内聚、低耦合的编程思想。使用如下语法即可完成请求转发:

request.getRequestDispatcher("index.jsp").forward(request, response);

注意:转发时浏览器地址不发生变化,重定向时由于浏览器发送了两次请求,所以不能在 request 里面存放数据。

案例:转发传值

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;

public class TestServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        request.setAttribute("id", 12);
        request.setAttribute("name", "张三");
        request.getRequestDispatcher("index.jsp").forward(request, response);
    }
}

jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>INDEX</title>
</head>
<body>
<p>id:<%=request.getAttribute("id")%>
</p>
<p>name:${name}
</p>
</body>
</html>

案例:登录表单回填

login.jsp

<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
    <title>LOGIN</title>
</head>
<body>
<form action="login">
    <input name="name" type="text"
           value="${name}"/>
    <input name="password" type="text"
           value="<%=request.getAttribute("password")==null?"":request.getAttribute("password")%/>">
    <input type="submit" value="提交"/>
</form>
</body>
</html>

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;

public class LoginServlet extends HttpServlet {
   
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        if ("123".equals(password)) {
   
            request.getSession().setAttribute("userInfo", name);
            response.sendRedirect("index.jsp");
            return;
        }
        request.setAttribute("name", name);
        request.setAttribute("password", password);
        request.getRequestDispatcher("login.jsp").forward(request, response);
    }
}

练习:

1.创建项目 demo4 编写一个 index.jsp 页面,输入圆的半径以 post 请求提交给一个 Servlet。Servlet 对半径进行判定,若为 null 或 <=0 的数,重定向到 index.jsp 页面,若为 >0 的值,则转发到 success.jsp 页面,并显示其面积、周长。

参考代码:

index.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
<form action="check" method="post">
    <input name="number"/>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

CheckServlet

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

抹泪的知更鸟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值