云计算百科
云计算领域专业知识百科平台

JavaWeb笔记(web、服务器、Tomcat、Maven、Servlet)

JavaWeb笔记(web、服务器、Tomcat、Maven、Servlet)

Servlet

Maven

黑马程序员新版JavaWeb

一. 基本概念

1.1 web开发

  • web,网页的意思,www.baidu.com
  • 静态web
    • html,css
    • 提供给所有人看的数据始终不会变化!
  • 动态web
    • 淘宝,几乎是所有的网站;
    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同
    • 技术栈:servlet/ISP,ASP,PHP
  • 在Java中,动态web资源开发的户数统称为Javaweb

1.2 web应用程序

image-20230114212049954

1.3 静态web

image-20230114214752579

1.4 动态web

image-20230114220504277

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

image-20230114220552189

二. web服务器

2.1 相关技术

image-20230115125352335

image-20230115125722275

2.2 服务器

image-20230115130040863

三. Tomcat

3.1 配置

image-20230115130647973

image-20230115130831820

image-20230115131331483

image-20230115131742068

image-20230115131734406

3.2 DNS

image-20230115131950486

image-20230115132000125

image-20230115132008970

3.3 发布一个网站

image-20230115132626226

四. HTTP

4.1 什么是HTTP

  • 超文本(Hyper text)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本

image-20230115133229224

  • HTTP(超文本传输协议)是一个简单的请求–响应协议,通常运行在TCP上
  • HTTPS:安全的

image-20230115133418812

4.2 HTTP请求和响应

image-20230115134200008

image-20230115134639377

image-20230115134949200

五. Maven

pom文件配置

  • 加上插件 依赖 propertites

<?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">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>filter-demo</artifactId>
<version>1.0-SNAPSHOT</version>

<packaging>war</packaging>

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

<dependencies>

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

</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<port>80</port>
</configuration>
</plugin>
</plugins>
</build>

</project>

5.1 下载步骤

  • MAVEN下载历史版本

  • 史上最全安装Maven教程

  • 这里如果每次建新的工程用的都不是本地仓库,可以在files->new project setting 里面设置

  • 创建新的Maven项目需要配置一些东西

image-20230115150500952

5.2 IDEA中配置Tomcat

  • 链接

5.3 Jar包

  • jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。

5.4 简介

  • 用于专门管理和构建Java项目的工具

    • 提供了一套标准化的项目结构:不同IDE之间项目的目录结构不一样,那么换不同的IDE(集成开发环境)就会有麻烦,Maven就规定了一套项目结构,方便使用不同的IDE来编写代码image-20230115162949811外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

    • 提供了一套标准化的构建流程:编译、测试、发布、打包,Maven提供了简单的命令来完成项目构建,只需要一个命令,Maven就可以把一个项目进行打包,变成一个jar包,将来只要把jar包发送给别人,别人就能直接运行image-20230115163716236

    • 提供了一套依赖管理机制:依赖管理就是管理你项目依赖的第三方资源image-20230115164201770image-20230115164148476

5.5 仓库

image-20230115171631051

image-20230115171728933

5.6 坐标

5.6.1 概念

image-20230115172136888

  • Maven坐标作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
5.6.2 必记网站
  • mvnrepository.com

  • 以后的jar包基本上都是从这个仓库下载的,找到jar包并且复制代码即可

5.7 使用IDEA创建Maven程序

image-20230116181813367

  • pom.xml
  • 【狂神说Java】JavaWeb入门到实战 P6

<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/maven-v4_0_0.xsd">

<!–指定pom版本模型–>
<modelVersion>4.0.0</modelVersion>
<!–组织ID–>
<groupId>org.example</groupId>
<!–项目ID–>
<artifactId>test02</artifactId>
<!–打包方式,web工程打包为war,java工程打包为jar–>
<packaging>war</packaging>
<!–版本号:release(完成版)、SNAPSHOT(开发版)–>
<version>1.0-SNAPSHOT</version>
<name>test02 Maven Webapp</name>
<url>http://maven.apache.org</url>
<!–设置当前工程的所有依赖–>
<dependencies>
<!–具体的依赖–>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<!–构建–>
<build>
<!–设置插件–>
<plugins>
<plugin>
<!–从官网找的jar包–>
<!– https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin –>

<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<!–端口号–>
<port>8080</port>
<!–路径:/可以更快–>
<path>/</path>
</configuration>

</plugin>
</plugins>
</build>

</project>

5.8 依赖管理

5.8.1 依赖配置
  • 添加依赖的步骤
    • 在dependencies中配置dependency

image-20230115210942994

  • 如果想要使用别的项目,需要把该项目的坐标复制到主动项目的dependency里面
5.8.2 依赖传递

image-20230115212257203

image-20230115212513708

image-20230115212600414

image-20230115212621610

image-20230115212746948

  • 可选依赖是不想让引用你的人看到你引用了哪些东西
  • 排除依赖是不想看你引用的人引用了哪些东西
    • 排除依赖不写版本号,因为不想看所有引用
5.8.3 依赖范围

image-20230115213420457

image-20230115213622450

image-20230115214157620

5.8.4 生命周期与插件

image-20230115221320398

插件可以理解为在生命周期的某个节点上干什么事

image-20230115222005945

六. servlet

  • 注意手动导包,复制粘贴tomcat的servlet到lib目录下

6.1 概述

image-20230115224258587

image-20230115224431079

6.2 快速入门

  • pom文件

  • <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/maven-v4_0_0.xsd">

    <!–指定pom版本模型–>
    <modelVersion>4.0.0</modelVersion>
    <!–组织ID–>
    <groupId>org.example</groupId>
    <!–项目ID–>
    <artifactId>项目名</artifactId>
    <!–打包方式,web工程打包为war,java工程打包为jar–>
    <packaging>war</packaging>
    <!–版本号:release(完成版)、SNAPSHOT(开发版)–>
    <version>1.0-SNAPSHOT</version>
    <name>test02 Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <!–设置当前工程的所有依赖–>
    <dependencies>
    <!–具体的依赖–>
    <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>3.8.1</version>
    <scope>test</scope>
    </dependency>
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
    </dependency>
    </dependencies>
    <!–构建–>
    <build>
    <!–设置插件–>
    <plugins>
    <plugin>
    <!–从官网找的jar包–>
    <!– https://mvnrepository.com/artifact/org.apache.tomcat.maven/tomcat7-maven-plugin –>

    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.1</version>
    </plugin>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
    <source>8</source>
    <target>8</target>
    </configuration>
    </plugin>
    </plugins>
    </build>

    </project>

  • 步骤

image-20230115234034768

  • 解决[ERROR] 不再支持源选项 6。请使用 7 或更高版本。即compile failure,把6改成7就好了image-20230116004709258

在这里插入图片描述

image-20230116004941707

<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/maven-v4_0_0.xsd">

<properties>
<maven.compiler.source>19</maven.compiler.source>
<maven.compiler.target>19</maven.compiler.target>
</properties>
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>web-Demo</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>web-Demo Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>7</source>
<target>7</target>
</configuration>
</plugin>
</plugins>
</build>

</project>
这里还是乱码的打开tomcat的配置,有个vm options,加上-Dfile.encoding=UTF-8

6.3 执行流程

image-20230116005411737

6.4 生命周期

image-20230116005748014

  • 如果不成功查看自己的路径,必须要在自己的模块路径下使用mvn tomcat7:run才行,否则会找不到tomcat7插件,右键模块open in terminal, ctrl+c关闭进程

image-20230116011618703

6.5 方法介绍

image-20230116012153819

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;

@WebServlet(urlPatterns = "/demo3",loadOnStartup = 1)
public class ServletDemo3 implements Servlet {
/**
* 提升变量作用域
*/

private ServletConfig config;

/**
* 初始化方法
* 1.调用时机:默认情况下,servlet被第一次访问时,调用
* 2.调用次数:1次
* @param config
* @throws ServletException
*/

@Override
public void init(ServletConfig config) throws ServletException {
//在init方法里面对成员变量进行赋值,把当前局部变量的值赋值给成员变量
//那么将来在getServletConfig方法里面把config返回就可以了,这个时候返回的就是被局部变量赋值的成员变量config
this.config = config;
System.out.println("init…");
}

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

/**
* 提供服务
* 1.调用时机:每一次servlet被访问时,调用
* 2.调用次数:多次
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet Hello Java!");
}

/**
*获得相关信息,一般返回空字符串
* @return
*/

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

/**
* 销毁方法
* 1.调用时机:内存释放或者服务器关闭,servlet对象会被销毁,调用
* 2.调用次数:1次,因为对象被销毁一次
*/

@Override
public void destroy() {

System.out.println("destroy…");
}
}

6.6 体系结构

image-20230116013117771

  • 在浏览器直接输入url是get的方法
  • 使用post方法,我们需要有一个表单

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/web-Demo/demo5" method="post">
<input name="username"><input type="submit">
</form>
</body>
</html>

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class MyHttpServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {

}

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

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//根据请求方式不同,进行分别处理
HttpServletRequest request = (HttpServletRequest) servletRequest;
//获取请求方式
String method = request.getMethod();
//判断
if ("GET".equals(method)){
//get方式的处理逻辑
doGet(servletRequest,servletResponse);
}else if ("POST".equals(method)){
//post方式的处理逻辑
doPost(servletRequest,servletResponse);
}

}

protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
}

protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
//protected表示子类可以看到这个方法
}

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

@Override
public void destroy() {

}
}

package com.itheima.web;

import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@WebServlet("/demo5")
public class ServletDemo5 extends MyHttpServlet {
@Override
protected void doGet(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("get…");
}

@Override
protected void doPost(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println("post…");
}
}

image-20230116021525821

6.7 urlPattern配置

image-20230116023915050

image-20230116023934855

  • 注意:这里扩展名优先级小于 /*

6.8 XML配置方式编写Servlet

image-20230116024226440

99-109 117 124-127

6.9 Request

  • 要想使用tomcat7运行maven,需要在pom文件中配置插件,不需要代码,只需要手动导包即可
6.9.1 request继承体系

image-20230116102639305

  • 案例
    • 说明了Tomcat创建了req对象,并有自己的实现类

image-20230116103017446

image-20230116103025776

6.9.2 request获取请求数据
6.9.2.1 获取请求数据
  • 请求数据而分为三部分:

    • 请求行:请求参数/协议/版本号image-20230116103541234

      • package com.itheima.web;

        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("/req1")
        public class RequestDemo1 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取请求方式
        String method = req.getMethod();
        System.out.println(method);//GET
        //获取虚拟目录
        String contextPath = req.getContextPath();
        System.out.println(contextPath);///web-Demo
        //获取url
        StringBuffer requestURL = req.getRequestURL();
        System.out.println(requestURL.toString());//http://localhost:8080/web-Demo/req1
        //获取uri
        String requestURI = req.getRequestURI();
        System.out.println(requestURI);///web-Demo/req1
        //获取请求参数(GET方式)
        String queryString = req.getQueryString();
        System.out.println(queryString);//username=zhangsan&password=123

        }

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

        }
        }

      • image-20230116104549987

      • image-20230116104559645

    • 请求头:image-20230116104750933

    • 请求体:image-20230116104755408

package com.itheima.web;

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

@WebServlet("/req1")
public class RequestDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求方式
String method = req.getMethod();
System.out.println(method);//GET
//获取虚拟目录
String contextPath = req.getContextPath();
System.out.println(contextPath);///web-Demo
//获取url
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL.toString());//http://localhost:8080/web-Demo/req1
//获取uri
String requestURI = req.getRequestURI();
System.out.println(requestURI);///web-Demo/req1
//获取请求参数(GET方式)
String queryString = req.getQueryString();
System.out.println(queryString);//username=zhangsan&password=123

//获取请求头user-agent获取浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
//获取请求体(写一个表单变成post)

}

//前端数据通过这个传递回来
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取post 请求体:请求参数,通过流的方式获取
//获取字符输入流(因为这里需要返回的参数都是字符串形式)
BufferedReader reader = req.getReader();
//读取数据
String line = reader.readLine();
System.out.println(line);
//这里这个流不用关闭,因为这个流是req调用的,将来req被销毁的时候,流会自动关闭

}
}

//一个表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!–就会把表单数据通过post方式提交到req1里面–>
<!–那么将来在req1里面就可以用dopost方法执行相应的业务逻辑–>
<form action="/web-Demo/req1" method="post">
<input type="text" name="username">
<input type="password" name="password">
<input type="submit">

</form>
</body>
</html>

6.9.2.2 通用方式获取请求参数

image-20230116110547567

image-20230116111129108

  • 代码

package com.itheima.web;

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.util.Map;

@WebServlet("/req2")
public class RequestDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//System.out.println("get…");
//获取集合参数
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
//规定格式为:username:zhangsan
//key就是表单里面规定的name
System.out.print(key+":");

//获取值(这是一个字符串数组)
String[] values = map.get(key);
for (String value : values) {
System.out.print(value+" ");
}

//每次循环结束后换行
System.out.println();
}
System.out.println("**************************");
//2.获取参数值
//根据key获取参数值,数组,返回一个字符串数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}

//根据key,获取单个值
String username =req.getParameter("username");
String password =req.getParameter("password");
System.out.println(username);
System.out.println(password);

}

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

/*System.out.println("post…");
//获取集合参数
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
//规定格式为:username:zhangsan
//key就是表单里面规定的name
System.out.print(key+":");

//获取值(这是一个字符串数组)
String[] values = map.get(key);
for (String value : values) {
System.out.print(value+" ");
}

//每次循环结束后换行
System.out.println();
}
System.out.println("**************************");
//2.获取参数值
//根据key获取参数值,数组,返回一个字符串数组
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
}

//根据key,获取单个值
String username =req.getParameter("username");
String password =req.getParameter("password");
System.out.println(username);
System.out.println(password);*/

}
}

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<!–就会把表单数据通过post方式提交到req2里面–>
<form action="/web-Demo/req2" method="post">
<input type="text" name="username"><br>
<input type="password" name="password"><br>
<input type="checkbox" name="hobby" value="1">游泳
<input type="checkbox" name="hobby" value="2">爬山<br>
<input type="submit">

</form>
</body>
</html>

  • 快捷键新建sevlet项目,在webapp上右键新建servlet,如果没有servlet选项,就把src目录添加为资源目录,让他变蓝
  • 另外还得在stucture页面导入一个tomcat的servlet包
    • 链接

img

img

image-20230116152740752

  • 创建Servlet的小工具,右键servlet即可,要注意要选中默认名字serclet之后再改,不然ok不会变黑

package main.web;

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

@WebServlet("/req4")
public class RequestDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

6.9.2.3 请求参数中文乱码处理
  • 编码和解码

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;

public class URLDemo {
public static void main(String[] args) throws UnsupportedEncodingException {

String username = "张三";
//1.URL编码
String encode = URLEncoder.encode(username,"utf-8");
System.out.println(encode);//%E5%BC%A0%E4%B8%89

//2.URL解码
String decode = URLDecoder.decode(encode,"utf-8");
System.out.println(decode);//张三

}
}

  • 解决乱码最终代码

import com.sun.net.httpserver.HttpServer;

import javax.jws.WebService;
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.nio.charset.StandardCharsets;

@WebServlet("/req")
public class requestdemo1 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post方式乱码
//req.setCharacterEncoding("utf-8");
//resp.setCharacterEncoding("utf-8");

//获取username的值
String name = req.getParameter("username");
System.out.println("解决乱码前: "+name);//解决乱码前: å¼ ä¸
//先对乱码进行编码,转化为字节数组
// byte[] bytes = name.getBytes(StandardCharsets.ISO_8859_1);
//字节数组解码
// name = new String(bytes, StandardCharsets.UTF_8);
// System.out.println("解决乱码后: "+name);

//合并为一行
//其实下面的可以是post和get通用解决方式
name = new String(name.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
System.out.println("解决乱码后: "+name);//张三

}

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

第二种解决方式:
把pom文件里面的Tomcat插件换一个更高级的,如下图,把tomcat7换一个导入

image-20230116205101542

  • post

image-20230116194753166

  • get

image-20230116202659883

image-20230116204837332

6.9.2.4 一些零碎问题
  • 这个可以解决导入包之后任然没有反应的问题,也可以解决maven运行程序名字不是项目名的问题,如图左下角M图标

image-20230116194859598

  • 网页中提交出现404的问题

    • pom中改一下项目名image-20230116195051778

    • 控制台里面需要输出这些信息注意8080后面的项目名image-20230116195146836

  • 404还有一个可能原因

    • java类前面少加了一个杠image-20230116195253797

    • 或者iml文件中定位不准确,一定是项目名后面加上java类前面的webservlet注释image-20230116195345177

  • 还有无法继承HttpServlet原因

    • 要自己建一个lib目录,把tomcat的servlet包放进去image-20230116195508395
  • 尽量选择1.8的JDK

  • 报错,解决方法就是要么看@WebServlet里面有没有加斜杠,要么看有没有复制类的时候重复了image-20230116220051200

6.9.3 request请求转发

image-20230116210028227

image-20230116210937409

  • 实现资源转发

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("/req2")
public class requestdemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo2…");
//存储数据
req.setAttribute("msg","hello");
//请求转发
req.getRequestDispatcher("/req3").forward(req,resp);

}

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

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("/req3")
public class requestdemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("demo3…");
//获取数据
Object msg = req.getAttribute("msg");
System.out.println(msg);

}

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

  • 效果实现 在这里插入图片描述

image-20230116211412275

  • 特点
    • 注意只能是同一个服务器

image-20230116211532309

6.10 Response

image-20230116211709003

6.10.1 设置响应数据功能介绍

image-20230116212050013

6.10.2 完成重定向

image-20230116212508819

  • setHeader里面的location是固定不变的

设置响应状态码 302(这个状态码是固定不变的)

package response;

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

@WebServlet("/resp1")
public class ResponseDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("resp1…");

/*//重定向
//一.第一种方式
//1.设置响应状态码 302(这个状态码是固定不变的)
response.setStatus(302);
//2.设置响应头 Location(不区分大小写),后面是资源B的路径
response.setHeader("Location","resp2");*/

//二.第二种方式(必须加虚拟路径)
//response.sendRedirect("/javaweb01/resp2");
response.sendRedirect("http://www.baidu.com");

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
//可以跳转到百度

  • 表单提交可以使用重定向,防止重复提交
6.10.3 重定向和请求转发的区别

image-20230116214150974

6.10.4 资源路径设置问题

image-20230116214610179

  • 动态获取虚拟目录(为了应对原码路径更改问题)

//二.第二种方式(必须加虚拟路径)
//response.sendRedirect("http://www.baidu.com");
//动态获取虚拟路径
//因为这个方法是获取请求行中目录,所以用得是request获取虚拟路径
String contextPath = request.getContextPath();
response.sendRedirect(contextPath+"/resp2");

6.10.5 响应字符数据
  • 代码

package response;

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;

/**
* 响应字符数据:设置字符数据的响应体
*/

@WebServlet("/resp3")
public class ResponseDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//防止中文乱码,此步是告诉浏览器解析的时候当做html解析,不要当做纯文本
response.setContentType("text/html;charset=utf-8");
//content-type
//此步是告诉浏览器解析的时候当做html解析,不要当做纯文本
//response.setHeader("content-type","text/html");
//获取字符串输出流,获取打印流对象,直接在网页上打印响应信息
PrintWriter writer = response.getWriter();
writer.write("<h1>不要乱码<h1>");

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

image-20230116222157997

6.10.6 响应字节数据

image-20230116222221658

  • 为了避免如下代码(太麻烦),我们可以在pom.xml中引入一个commons-io的依赖,方法集成了拷贝和输出的功能

//3.完成流的copy(数据对拷)
byte[] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=1){
os.write(buffer,0,len);
}

<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>

package response;

import org.apache.commons.io.IOUtils;

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

/**
* 响应字符数据:设置字符数据的响应体
*/

@WebServlet("/resp4")
public class ResponseDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.读取文件
//媒体文件可以直接写Path from content root
FileInputStream fis = new FileInputStream("media/1.jpg");

//2.获取response字节输出流
ServletOutputStream os = response.getOutputStream();

//3.完成流的copy(数据对拷)
/*byte[] buffer = new byte[1024];
int len = 0;
while ((len=fis.read(buffer))!=-1){
os.write(buffer,0,len);
}*/

//上述代码可以被以下代码替换
//下面的方法集成了拷贝和输出的功能
IOUtils.copy(fis,os);
fis.close();

}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}

image-20230116223814194

6.11 练习

6.11.1 报错
  • 报500:No suitable driver found for…,这个原因是没有把驱动放到WEB-INF目录下,可以在WEB-INF目录下创建一个lib目录,把驱动复制进去

image-20230117145443252

  • 报错原因是java代码里的名字和数据库字段名字不一样

image-20230117145757613 image-20230117145501448 image-20230117145820752

  • 空指针异常原因

image-20230117145833394

赞(0)
未经允许不得转载:网硕互联帮助中心 » JavaWeb笔记(web、服务器、Tomcat、Maven、Servlet)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!