Servlet与JSP的基本使用(一)

本文详细介绍Java Web开发的基础知识,包括Servlet、JSP的基本使用,请求与响应处理,以及请求转发等核心概念。涵盖Servlet生命周期、POST请求中文乱码解决、JSP动态HTML生成等内容。

一、Java开发web应用程序

(一) Servlet 服务器端的程序

所有 servlet 需要继承 HttpServlet 父类
覆盖父类中的 service(HttpServletRequest request, HttpServletResponse response) {
}

在类上加一个注解 @WebServlet(urlPattern="/路径")

响应:
@WebServlet(urlPatterns = "/date")
public class MyServlet extends HttpServlet {

    @Override
    //       req 请求                resp 响应
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    	// 设置响应的字符编码
        resp.setCharacterEncoding("utf-8");
        // 告知浏览器,请浏览器用 utf-8 编码来显示
        resp.setContentType("text/html;charset=utf-8");

        String html = "<html><body><h1>" + new Date() +"</h1></body></html>";
        // 将一段 html 作为响应内容,写入输出流
        resp.getWriter().print(html);
    }
}

请求:
@WebServlet(urlPatterns="/映射路径")
class MyServlet extends HttpServlet {

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException{
        // 处理请求和响应的代码
        String 参数值 = request.getParameter("请求参数名");
        // 用response返回响应
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("<html>");
    }
}

注:写在src-新建包下或maven-src-main-java-新建包下

(二) JSP (java server page) 动态html

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

Address already in bind 8080

<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>现在时间是:<% out.print(new Date()); %></h1>
</body>
</html>

注:写在web下或maven-src-main-webapp下

二、Servlet 的生命周期

  • 当 servlet 首次被访问时 ,调用构造方法,只调用一次(只有一个servlet对象被创建)
  • 紧接着调用初始化 init 方法,也是只调用一次
  • 根据请求方式,调用 service,或 doGet 或 doPost (请求几次,就会被调用几次)
  • 当应用程序停止前,调用 destroy 方法,只调用一次

这些方法都是由 tomcat 容器来调用, 这种方式称之为控制反转

Servlet 默认是在第一次访问时被加载,也可以配置服务器启动时被加载 loadOnStartup = 数字
数字代表优先级,数字小的表示优先级高,还可以设置初始化参数

三、Servlet

(一) post 请求中的汉字乱码问题

原因:

String sex = URLEncoder.encode("男", "utf-8");
System.out.println(sex);
// iso-8859-1
String result = URLDecoder.decode("%E7%94%B7", "iso-8859-1");
System.out.println(result); // ç”·

解决方法,在调用 getParameter 方法之前:

request.setCharacterEncoding("utf-8")

(二) request重要方法

在这里插入图片描述

四、JSP中的常见表单项和事件

(一) disabled和readonly

disabled 表单项 提交时不会发送给服务器
readonly 表单项 提交时会发送给服务器
onsubmit 事件 会在表单提交之前触发,若返回为真表单则可提交,若为假则不能提交

<input type="text" name="username" value="张三" disabled />
<input type="text" name="username" value="张三" readonly />
<form action="servlet1" method="post" οnsubmit="return false">

(二) 下拉列表

没有给 value, 就会把文字发送给服务器 ,若给了 value, 会把 value 的值发给服务器

        <p>
        <!-- multiple,多选 -->
            <select name="city" multiple>
                <option value="beijing">北京</option>
                <option value="shanghai">上海</option>
                <option value="shengzhen">深圳</option>
            </select>
        </p>

五、请求与响应

(一) 请求

  1. GET 两个部分
  • 请求行 ==> GET 路径/HTTP 1.1
  • 请求头
    • Host: 要访问那个虚拟主机 一个服务器下有多有 host, 每一个host 下,又有多个应用程序
    • Accept: 可以处理的内容格式:例如 text/html
    • Accept-Encoding : 能够支持的压缩格式
    • Accept-Language : 支持的语言, 例如 zh-CN
  1. POST 三个部分
  • 请求行
  • 请求头
    • Content-Type: 请求体的格式 application/www-form-urlencoded (普通表单格式)
    • Content-Length: 请求体内容的长度
  • 请求体
    • post的请求参数放入了请求体当中,例如:username=zhangsan&password=123,如果有中文,会自动编码

(二) 响应

  1. 状态码
  • 200 表示响应正确返回
  • 404 表示请求的资源不存在
  • 500 表示服务器内部出现了异常
  • 304 表示该内容没有被修改,那么服务器只会返回状态码和头,不需要返回响应体(图片,html,css,js)
  1. 响应头
  • content-type: 响应的内容格式, 例如 text/html;charset=utf8

  • content-length: 响应体的长度(字节)

  • Date: 响应生成时间

  1. 响应体
  • html内容,图片内容

六、返回动态图片

@WebServlet(urlPatterns = "/servlet2")
public class Servlet2 extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        // 图片验证码
        // 1. 创建图片对象, 构造参数分别代表 宽、高、图片格式
        BufferedImage image = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);

        // 2. 创建画布对象
        Graphics2D g = image.createGraphics();

        // 3. 填充画布
        g.setColor(Color.GREEN);
        g.fillRect(0,0,200,100);
        // 写入文字
        g.setColor(Color.BLACK);
        g.setFont(new Font("微软雅黑", Font.ITALIC, 32));
        String s = random(4);
        g.drawString(s, 0, 32);

        g.setColor(Color.RED);
        g.drawLine(0,0,200,100);

        // 4. 把图片内容输出到响应
        resp.setContentType("image/png");
        // 参数1 图片对象, 参数2 图片压缩格式 png|jpeg, 参数3: 输出字节流
        ImageIO.write(image, "png", resp.getOutputStream());
    }

    Random random = new Random();
    String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    public String random(int n) {
        StringBuilder sb = new StringBuilder(n);
        for (int i = 0; i < n; i++) {
            int idx = random.nextInt(str.length()); // 随机的下标
            sb.append(str.charAt(idx));
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        System.out.println("abcdefghijklmnopqrstuvwxyz".toUpperCase());
    }
}
!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script>
        function changeImage() {
            document.getElementById("img").src= "servlet2?a=" + new Date().getTime();
        }
    </script>
</head>
<body>
    <img src="img/1.jpg"/>

    <img src="servlet2" onclick="changeImage()" id="img">
</body>
</html>

七、请求转发

由于servlet中实现html代码并不方便,而jsp格式中实现java代码是一种反模式。所以需要利用请求转发,利用servlet来处理表单请求 , 跳转至jsp来生成html代码并返回。

  1. 请求转发
request.getRequestDispatcher("jsp路径").forward(request, response);
  1. 作用域传参,把servlet中的变量传递给jsp显示
request.setAttribute("变量名", 对象);
  • 取(在jsp页面),通过 EL 表达式取
${ 变量名 }
${ 变量名.属性名 }    el 表达式中的属性名,对应着java对象中的 get,set方法名。java8后可以直接调用get方法来获取参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值