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应用程序
1.3 静态web
1.4 动态web
二. web服务器
2.1 相关技术
2.2 服务器
三. Tomcat
3.1 配置
3.2 DNS
3.3 发布一个网站
四. HTTP
4.1 什么是HTTP
- 超文本(Hyper text)是用超链接的方法,将各种不同空间的文字信息组织在一起的网状文本
- HTTP(超文本传输协议)是一个简单的请求–响应协议,通常运行在TCP上
- HTTPS:安全的
4.2 HTTP请求和响应
五. 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项目需要配置一些东西
5.2 IDEA中配置Tomcat
- 链接
5.3 Jar包
- jar包就是别人已经写好的一些类,然后将这些类进行打包,你可以将这些jar包引入你的项目中,然后就可以直接使用这些jar包中的类和属性以及方法。
5.4 简介
-
用于专门管理和构建Java项目的工具
-
提供了一套标准化的项目结构:不同IDE之间项目的目录结构不一样,那么换不同的IDE(集成开发环境)就会有麻烦,Maven就规定了一套项目结构,方便使用不同的IDE来编写代码
-
提供了一套标准化的构建流程:编译、测试、发布、打包,Maven提供了简单的命令来完成项目构建,只需要一个命令,Maven就可以把一个项目进行打包,变成一个jar包,将来只要把jar包发送给别人,别人就能直接运行
-
提供了一套依赖管理机制:依赖管理就是管理你项目依赖的第三方资源
-
5.5 仓库
5.6 坐标
5.6.1 概念
- Maven坐标作用:使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
5.6.2 必记网站
-
mvnrepository.com
-
以后的jar包基本上都是从这个仓库下载的,找到jar包并且复制代码即可
5.7 使用IDEA创建Maven程序
- 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
- 如果想要使用别的项目,需要把该项目的坐标复制到主动项目的dependency里面
5.8.2 依赖传递
- 可选依赖是不想让引用你的人看到你引用了哪些东西
- 排除依赖是不想看你引用的人引用了哪些东西
- 排除依赖不写版本号,因为不想看所有引用
5.8.3 依赖范围
5.8.4 生命周期与插件
插件可以理解为在生命周期的某个节点上干什么事
六. servlet
- 注意手动导包,复制粘贴tomcat的servlet到lib目录下
6.1 概述
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>
-
步骤
- 解决[ERROR] 不再支持源选项 6。请使用 7 或更高版本。即compile failure,把6改成7就好了
<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 执行流程
6.4 生命周期
- 如果不成功查看自己的路径,必须要在自己的模块路径下使用mvn tomcat7:run才行,否则会找不到tomcat7插件,右键模块open in terminal, ctrl+c关闭进程
6.5 方法介绍
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 体系结构
- 在浏览器直接输入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…");
}
}
6.7 urlPattern配置
- 注意:这里扩展名优先级小于 /*
6.8 XML配置方式编写Servlet
99-109 117 124-127
6.9 Request
- 要想使用tomcat7运行maven,需要在pom文件中配置插件,不需要代码,只需要手动导包即可
6.9.1 request继承体系
- 案例
- 说明了Tomcat创建了req对象,并有自己的实现类
6.9.2 request获取请求数据
6.9.2.1 获取请求数据
-
请求数据而分为三部分:
-
请求行:请求参数/协议/版本号
- 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 {}
} -
-
- package com.itheima.web;
-
请求头:
-
请求体:
-
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 通用方式获取请求参数
- 代码
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包
- 链接
- 创建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换一个导入
- post
- get
6.9.2.4 一些零碎问题
- 这个可以解决导入包之后任然没有反应的问题,也可以解决maven运行程序名字不是项目名的问题,如图左下角M图标
-
网页中提交出现404的问题
-
pom中改一下项目名
-
控制台里面需要输出这些信息注意8080后面的项目名
-
-
404还有一个可能原因
-
java类前面少加了一个杠
-
或者iml文件中定位不准确,一定是项目名后面加上java类前面的webservlet注释
-
-
还有无法继承HttpServlet原因
- 要自己建一个lib目录,把tomcat的servlet包放进去
- 要自己建一个lib目录,把tomcat的servlet包放进去
-
尽量选择1.8的JDK
-
报错,解决方法就是要么看@WebServlet里面有没有加斜杠,要么看有没有复制类的时候重复了
6.9.3 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;
//请求转发
@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);
}
}
- 效果实现
- 特点
- 注意只能是同一个服务器
6.10 Response
6.10.1 设置响应数据功能介绍
6.10.2 完成重定向
- 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 重定向和请求转发的区别
6.10.4 资源路径设置问题
- 动态获取虚拟目录(为了应对原码路径更改问题)
//二.第二种方式(必须加虚拟路径)
//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);
}
}
6.10.6 响应字节数据
- 为了避免如下代码(太麻烦),我们可以在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);
}
}
6.11 练习
6.11.1 报错
- 报500:No suitable driver found for…,这个原因是没有把驱动放到WEB-INF目录下,可以在WEB-INF目录下创建一个lib目录,把驱动复制进去
- 报错原因是java代码里的名字和数据库字段名字不一样
- 空指针异常原因
评论前必须登录!
注册