Javaweb技术学习

 

 

 

 servlet

 pom.xml 打包方式为war包 servlet的scope属性必须配置为provided 在配置Tomcat插件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>javaweb</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <packaging>war</packaging>

    <modelVersion>4.0.0</modelVersion>

    <artifactId>Javaweb-04-servlet</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
<!--        servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

<!--    tomcat插件-->
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
            </plugin>
        </plugins>
    </build>


</project>

写一个自己的servlet 访问地址为ll  在idea中输出一段init的字符串

package com.cong.servlet;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
@WebServlet("/ll")
public class ServletDemo implements Servlet {
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("init");
    }

    @Override
    public ServletConfig getServletConfig() {
        return null;
    }

    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

    }

    @Override
    public String getServletInfo() {
        return null;
    }

    @Override
    public void destroy() {

    }
}

 

 

 


Request获取来自网页的请求

Response 是回显给浏览器的响应数据

 

 


req对象通用方式获取请求参数

以下就是不同的请求方式不同的获取请求参数的方式

 

 

post请求提交 提交后走的时候doPost代码 调用的是doGet代码 通用方式 

package com.cong.servlet;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Map;

@WebServlet(value = "/ServletDemo03")
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取全部的请求数据
        Map<String, String[]> parameterMap =
                request.getParameterMap();
        //遍历map集合
        for (String s : parameterMap.keySet()) {
            System.out.print(s + " :");
            String[] strings = parameterMap.get(s);
            for (String string : strings) {
                System.out.print(string + ", ");
            }
            //换行
            System.out.println();
        }
        //------------------

        //获取单行数据 指定获取的名字
        String username = request.getParameter("username");
        System.out.println(username);
        String password = request.getParameter("password");
        System.out.println(password);

        //获取多行数据
        System.out.println("------------------");
        String[] hobbies = request.getParameterValues("hobby");
        for (String hobby : hobbies) {
            System.out.println(hobby);
        }
    }
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}

 提交后


 

//解决请求中文乱码问题
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        response.setCharacterEncoding("utf-8");
        String name = request.getParameter("username");

 请求转发


 



@WebServlet(value = "/ResponseDemo01")
public class ResponseDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("ResponseDemo01...");
//        // 设置响应状态码302
//        response.setStatus(302);
//        // 设置响应头信息
//        response.setHeader("Location", "/ResponseDemo02");

        //简化版 重定向
        response.sendRedirect("/ResponseDemo02");
        //区别于 转发 两次请求 而且可以重定向到外部服务器资源
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 response响应字符字节数据

@WebServlet(value = "/ResponseDemo03")
public class ResponseDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应字符输出流
        //告诉浏览器是html格式的
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("aaa");
        response.getWriter().write("你好");
        response.getWriter().write("<h1>aaa</h1>");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

 设置字节输出流


//设置字节输出流的编码
@WebServlet(value = "/ResponseDemo04")
public class ResponseDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应一个图片 设置字节输出流的编码
        FileInputStream fileInputStream = new FileInputStream("D:\\1.png");

        ServletOutputStream outputStream = response.getOutputStream();

//完成对接 这种方法太垃圾 用工具类
//        byte[] bytes = new byte[1024];
//        int len = 0;
//        while ((len = fileInputStream.read(bytes)) != -1) {
//            outputStream.write(bytes, 0, len);
//        }

        //使用工具类
        IOUtils.copy(fileInputStream,outputStream);
      fileInputStream.close();

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
}

工具类

<!--        commons-io工具包-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>

 

review:
1. post提交方式下的设置编码,防止中文乱码
   request.setCharacterEncoding("utf-8");
   get提交方式,tomcat8开始,编码不需要设置
   tomcat8之前,get方式设置比较麻烦:
   String fname = request.getParameter("fname");
   byte[] bytes = fname.getBytes("iso-8859-1");
   fname = new String(bytes,"UTF-8");

2. Servlet继承关系以及生命周期
   1) Servlet接口 : init() , service() , destroy()
       GenericServlet抽象子类: abstract service();
       HttpServlet抽象子类:实现了service方法,在service方法内部通过request.getMethod()来判断请求的方式,
            然后根据请求的方式去调用内部的do方法。每一个do方法进行了简单实现,主要是如果请求方式不符合,则报405错误。
            目的是让我们的Servlet子类去重写对应的方法(如果重写的不对,则使用父类的405错误实现)
   2) 生命周期:实例化、初始化、服务、销毁
        - Tomcat负责维护Servlet实例的生命周期
        - 每个Servlet在Tomcat容器中只有一个实例,它是线程不安全的
        - Servlet的启动时机:<load-on-startup>
        - Servlet3.0开始支持注解: @WebServlet

3. HTTP协议:
   1) 由 Request 和 Response 两部分组成
   2) 请求包含了三部分:请求行、请求消息头、请求主体: 普通的get方式请求-query string;post方式- form data ; json格式 - request payload
   3) 响应包含了三部分:响应行、响应消息头、响应主体

4. HttpSession
   1) HttpSession :表示 会话
   2) 为什么需要HttpSession , 原因是因为 Http协议是无状态的
   3) Session保存作用域 :一次会话范围都有效 ; void session.setAttribute(k,v) ,Object session.getAttribute(k)
   4) 其他的API: session.getId() , session.isNew() , session.getCreationTime() , session.invalidate() 等等

5. 服务器端转发和客户端重定向
   1) 服务器端转发 : request.getRequestDispatcher("index.html").forward(request,response);
   2) 客户端重定向: response.sendRedirect("index.html");

6. thymeleaf的部分标签
   1) 使用步骤: 添加jar , 新建ViewBaseServlet(有两个方法) , 配置两个<context-param> : view-prefix , view-suffix
   2) 部分标签: <th:if> , <th:unless> , <th:each> , <th:text>

今日内容:
1. 保存作用域
   原始情况下,保存作用域我们可以认为有四个: page(页面级别,现在几乎不用) , request(一次请求响应范围) , session(一次会话范围) , application(整个应用程序范围)
   1) request:一次请求响应范围
   2) session:一次会话范围有效
   3) application: 一次应用程序范围有效

2. 路径问题
   1) 相对路径
   2) 绝对路径

3. 实现库存系统的功能

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值