标签:Web Java web int final static SC 狂神 public
JavaWeb
1. web服务器:
1.1 前言:
web开发:
-
web,网页的意思,www.baidu.com·
-
静态web
-
html,css
-
提供给所有人看的数据始终不会发生变化!
-
-
动态web
-
淘宝,几乎是所有的网站;
-
提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同!
-
技术栈:Servlet/JSP,ASP,PHP
-
1.2 web应用程序web应用程序:
可以提供浏览器访问的程序;
-
a.html、b.html.….多个web资源,这些web资源可以被外界访问,对外界提供服务;
-
你们能访问到的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
-
URL
-
这个统一的web资源会被放在同一个文件夹下,web应用程序>Tomcat:服务器
-
一个web应用由多部分组成(静态web,动态web)
-
html,css,js
-
jsp,servlet
-
Java程序
-
jar包
-
配置文件(Properties)
-
Web应用程序编写完毕后,若想提供给外界访问;需要一服务器来统一管理
1.3 静态web
-
*.htm, *.html这些都是网员的后缀、如果服务器上一直存在这些东西,我们就可以直接进行读取、需要网络;
-
静态web存在的缺点
-
Web页面无法动态更新,所有用户看到都是同一个页面
-
轮播图,点击特效:伪动态
-
JavaScript[实际开发中,它用的最多]
-
VBScript
-
-
它无法和数据库交互(数据无法持久化,用户无法交互)
-
1.4 动态web
页面会动态展示,“web页面的展示效果因人而异”
缺点:
-
加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;
-
停机维护优点:
-
-
Web页面可以动态更新,所有用户看到都不是同一个页面
-
它可以与数据库交互(数据持久化:注册,商品信息,用户信息………)
1.5 web服务器
1.5.1 技术讲解
ASP:**
-
微软:国内最早流行的就是ASP;
-
·在HTML中嵌入了VB的脚本,ASP+COM;
-
·在ASP开发中,基本一个页面都有几干行的业务代码,页面极其换乱
-
·维护成本高!
-
C#
-
IIS
php:
-
PHP开发速度很快,功能很强大,跨平台,代码很简单(70%,WP)
-
·无法承载大访问量的情况(局限性)
jSP/Servlet: B/S;浏览和服务器C/S:客户端和服务器
-
sun公司主推的B/S架构
-
基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)
-
可以承载三高问题带来的影响;
-
语法像ASP,ASP->JSP,加强市场强度;
1.5.2 web服务器
服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息; lIS 微软的;ASP.,Windows中自带的 Tomcat
面向百度编程:
Tomcat是Apache 软件基金会(Apache Software Foundation)的jakarta项目中的一个核心项目,最新的Servlet 和JSP 规范总是能在Tomcat中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受lava爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。 Tomcat 服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。对于一个Java初学web的人来说,它是最佳的选择
Tomcat 实际上运行JSP页面和Serlet。
工作3-5年之后,可以尝试手写Tomcat服务器;
下载tomcat:
-
安装or解压
-
了解配置文件及目录结构
-
这个东西的作用
2. Tomcat:
2.0 Tomcat的作用:
2.1 Tomcat的启动和配置:
Tomcat的相关文件:
启动和关闭Tomcat:
测试是否成功启动的环境:www.localhost:8080.com
2.2 Tomcat配置:
上图中,port(端口号),name(端口号名),甚至是appBase(静态文件)都是可以进行修改的。
不过,如果要更改localhost这个域名,还要去电脑的host文件中,将127.0.0.1这个URL映射到新域名中。
其中,这个hosts文件的路径:C:\Windows\System32\drivers\etc\hosts
其中,localhost等价与127.0.0.1
在下图可以看到,这都是Tomcat页面展示。也就是说,一个文件(夹)就代表一个Web应用。
2.3 网页结构:
-
一个网页该有的(文件)结构:
--webapps :Tomcat服务器的web目录
-ROOT
-kuangstudy : 网站的目录名
- WEB-INF
-classes : java程序
-lib: web应用所依赖的jar包
-web.xml : 网站配置文件
- index.html 默认的首页
- static
-css
-style.css
-js
-img
-.....
高难度面试题:
请你谈谈网站是如何进行访问的!
注意,如果修改了hosts文件,那么改完hosts后要在命令提示符窗口输入ipconfig /flushdns 刷新DNS解析缓存
-
输入一个域名;回车
-
检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射;
-
有:直接返回对应的ip地址,这个地址中,有我们需要访问的web程序,可以直接访问
-
没有:去DNS服务器找,找到的话就返回,找不到就返回找不到;
-
3. Http:
3.1 Http是什么:
-
Http是一个简单的请求-响应协议,它通常运行在TCP之上。
-
Http有两个版本:
-
Http/1.0:客户端可以和web服务器连接后,只能获得一个web资源,获得后就断开连接
-
Http/1.1:客户端可以和web服务器连接后,可以获得多个web资源。
-
3.2 Http请求:
-
客户端发出请求,将请求你发送到服务端
以百度为例:
1. 请求 URL: https://www.baidu.com/
2. 请求方法: GET
3. 状态代码: 200 OK
4.远程地址: 163.177.151.110:443
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 语言
Cache-Control: max-age=0 高速缓存
Connection: keep-alive
Host: www.baidu.com 主机
1,请求行:
-
请求行中的请求方式:GET
-
请求方式:Get,Post,HEAD,DELETE,PUT,TRACT.…
-
get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
-
post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
-
2,消息头:
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
3.3 Http响应:
Connection: keep-alive 保持连接
Content-Encoding: gzip 编码格式
Content-Type: text/html; charset=utf-8 内容类型
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
```
3.4 响应状态码:
200:请求响应成功200 3xx:请求重定向·重定向:你重新到我给你新位置去; 4xx:找不到资源404·资源不存在; 5xx:服务器代码错误 500 502:网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?
4. Maven
我为什么要学习这个技术?
-
在Javaweb开发中,需要使用大量的jar包,我们手动去导入;
-
我们需要一个帮助我们自动导入和配置这个jar包的工具。
3. Mave是一项工具!
4.1 Maven项目架构管理工具
我们目前用Maven就是方便导入jar包的! Maven的核心思想:约定大于配置
-
我们在用Java写代码时要遵守Maven的规则!
4.2 下载安装Maven
下载完成后,解压即可;
4.3 配置环境变量
在我们的系统环境变量中配置如下配置:
-
M2_HOME: maven目录下的bin目录
-
MAVEN_HOME maven的目录
-
在系统的path中配置%MAVEN_HOME%\bin
4.4 阿里云镜像
-
镜像(mirrors):镜像也可以说是复制,备份。镜像的数据库中的数据和源数据库中的数据一致。
-
作用:加速我们的下载
-
国内建议使用阿里云的镜像
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
D:\桌面\Java环境配置文件\maven-3.8.5\conf\settings.xml (自己电脑配置源和仓库的文件位置)
4.5 本地仓库
建立一个本地仓库:localRepository
<localRepository>D:\桌面\Java环境配置文件\maven-3.8.5\maven-repo</localRepository>
4.6 在IDEA中使用Maven
-
第一步:
-
第二步:
-
第三步:
-
第四步:在IDEA中的设置中进行Maven设置
4.7 创建一个普通的maven项目:
-
第一步:
-
第二步:直接点击完成即可
-
注意:创建完成之后要手动去设置将仓库改为自己本地的。
-
4.8,零散知识:
-
干净的maven项目不同包的作用:
-
IDEA现实插件以及jar包:
4.9 在maven项目中配置Tomcat:
-
第一步:
-
第二步:
-
第三步:
-
第四步:
-
第五步:
在build中配置resources,来防止我们资源导出失败的问题
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>copy-xmls</id>
<phase>process-sources</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/classes</outputDirectory>
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
4.10 pom文件
-
pom.xlm中的build文件:
<build>
<finalName>javaweb-01-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default- bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
pow.xml 是Maven的核心配置文件
(百度)在maven仓库中想要什么就下载什么依赖就好了
如果导出jar包出错,那么就去博客园找maven 资源导出问题,以及resources节点配置
5、Servlet
5.1、Servlet简介
-
Servlet就是sun公司用来开发动态web的一门技术
-
Sun在这些APi中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
-
编写一个类,实现Servlet接口
-
把开发好java类部署到web服务器中
-
把实现了Servlet接口的Java程序叫做,Servlet
注意,是实现Servlet接口的程序。
注意,是实现Servlet接口的程序。
注意,是实现Servlet接口的程序。
5.2、HelloServlet
-
Maven Servlet 的依赖:
-
配置以下两个maven依赖:
-
<!--maven servlet 的依赖-->
<dependencies>
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
</dependencies> -
为什么要使用Maven来构建Servlet项目?
-
答:maven是一项自动导入和配置jar包的工具,所以用maven项目来构建Servlet可以快速导入和配置Servlet相关的jar包(也就是直接在pom.xml文件将依赖复制上去,就会自动去下载相关的依赖jar包)
Serlvet接口Sun公司有两个默认的实现类:HttpServlet,GenericServled
-
构建一个普通的Maven项目,删除里面的src目录,以后我们的学习就在这个项目里面建立Moudel;这个空的工程就题Maven主工程;
-
关于Maven父子工程的理解;
-
父项目中会有
子项目会有
<parent>
<artifactId>javaweb-02-servlet</artifactId>
<groupId>com.kuang</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
-
注意:2020年的IDEA是没有parent标签的
父项目中的java子项目可以直接使用
就像是Java程序中的继承一样: son extends father
-
Maven环境优化
-
修改web.xml为最新的
-
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0"
metadata-complete="true">
</web-app>
-
将maven的结构搭建完整
-
在子项目的main目录中构建java目录和resources目录
-
-
-
编写一个Servlet程序(在java目录中定义一个普通类,以及继承servlet接口)
1.编写一个普通类
2.实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter(); //响应流
writer.print("Hello,Serlvet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
-
5.编写Servlet的映射 为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
<!--注册Servlet-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
-
6.配置Tomcat
注意:配置项目发布的路径就可以了
-
前面写过了
-
-
7。启动测试(运行就好了)
-
问题1:
-
500错误,tomcat10版本不兼容问题,服务降级就好(tomcat9)
-
-
问题2:
-
问题3:
-
没有lib
-
去吧工程下的pom.xml里面依赖的
<scope>provided</scope>
(作用域)删掉 -
我的问题就这几个
-
-
-
原码阅读:
-
所以,GenericServlet是Servlet接口的实现类,HttpServlet类又继承GenericServlet类,故我们只 要定义一个类,继承HttpServlet类就算是实现Servlet接口了。
-
由此,我们可以看出Servlet函数中是具体调用各种请求的方法。但是,这些方法都是官方的固定简单使用,所以我们需要按照自己的需求来重写这些方法。
-
我们需要使用到什么方法,就直接重写这些方法就行。(一般只会使用到do和get方法)
-
由于Get和Post只是请求实现的方式不同,所以可以相互调用,并且结果都是一样的。
5.3、Servlet原理
Servlet是由Web服务器调用,web服务器在收到浏览器请求之后,会:
Web服务器调用Servlet的流程:
-
浏览器向web容器(也就是Tomcat服务器)发生Http请求
-
如果这个Http请求是第一次访问,那么就会产生一个Servlet
-
此外,web容器会产生两个对象,分别是:请求,响应
-
刚才产生的Servlet会调用Servlet接口,这个接口有一个service方法。而这个service方法就会处理请求和响应这个两个对象。
-
一开始的Http请求传入到service方法中作为ServletRequest变量。之后会去找这个请求对应的实现方法。(如果是Get请求,那就调用Get方法;如果是Post请求,那么就调用Post方法)(这些实现方法实现的功能是自己定义的。)
-
当请求的实现方法完成后,会返回一个响应信息,这个响应信息通过service方法封装到容器(Tomca服务器)中。
-
最后,web容器拿到响应信息会,将这信息发给客户端。
-
注意:我们自己重写的Request实现类会:接收处理请求,并给出响应的信息。
5.4、Mapping问题
-
一个Servlet可以指定一个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
一个servlet可以指定多个映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello3</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello5</url-pattern>
</servlet-mapping>
-
一个servlet可以指定通用映射路径
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello/*</url-pattern>
</servlet-mapping>
-
默认请求路径
<!--默认请求路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
-
指定一些后缀或者前缀等等…
<!--可以自定义后缀实现请求映射
注意点,*前面不能加项目映射的路径
hello/sajdlkajda.qinjiang
-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>*.qinjiang</url-pattern>
</servlet-mapping>
-
优先级问题 指定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求;
<!--404-->
<servlet>
<servlet-name>error</servlet-name>
<servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>error</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
5.5、ServletContext
web容器可以和多个servlet进行交互。
Context——上下文,起到承接作用,可以使得每一个servlet服务之间可以进行交互。
web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用;
1、共享数据
我在这个Servlet中保存的数据,可以在另外一个servlet中拿到;
-
保存数据的servlet:
-
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username = "热心";
//这算是键值对。
//将一个数据保存到了ServletContex中。
// 这个数据的名字是 username;值是 username所被赋予的值(热心)
context.setAttribute("username",username);
System.out.println("Hello Servlet!");
}
} -
读取所保存数据的类:
-
public class GetServlet extends HelloServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String username =(String) context.getAttribute("username");
//在相应时,要注意响应的数据是以什么编码形式进行编码。
// 要注意响应的数据是以什么样的格式输出出来。
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
resp.getWriter().print("名字是:"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
} -
网页的配置文件:
-
<!--注册: 写注册网页的名字;写网页请求访问的Java文件-->
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.peng.servlet.HelloServlet</servlet-class>
</servlet>
<!--写注册时网页的名字;写访问这个网页的路径-->
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getservlet</servlet-name>
<servlet-class>com.peng.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getservlet</servlet-name>
<url-pattern>/getservlet</url-pattern>
</servlet-mapping>
注意!!!:这里是先访问保存数据的类的那个网页,再访问读取数据的类。这样才能拿到数据。否则,如果先访问读取数据的类,返回结果是null。这是因为没有数据可以读取,所以输出null。
-
下图一中是没有访问过保存数据的类(hello),所以结果是null。图二是访问过保存数据的类,所以可以读取到数据。
2、获取初始化参数
-
第一步:在web.xml文件中配置web应用的初始化参数
<!--这是配置一些web应用初始化的参数
这下面是一个键值对。在对应的执行类使用context.getInitParameter("键名")方法
将对应的 键 输入进括号中,即可获得对应的值(String类型)
-->
<context-param>
<param-name>url</param-name>
<param-value>JTpeng</param-value>
</context-param>
-
第二步:去对应的使用类中去使用(获得)这个初始化参数
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
//获得context中的初始化参数
String url = context.getInitParameter("url");
resp.getWriter().print(url);
}
}
3、请求转发
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04这个类!");
//当请求这个类的路径(url)时,会将其他路径(url)的页面信息响应回客户端
//也可以理解为 ”页面转跳“
context.getRequestDispatcher("/demo").forward(req,resp);
}
//下图可以理解为:A通过访问B,B又可以转跳到C,从而获得C中的资源。
//实际上 A 访问的还是 B 的url;而不是C的。
4、读取资源文件
Properties
-
可以在java目录下新建properties
-
可以在resources目录下新建properties
-
注意,如果配置文件无法导出或者是无法生效,那么我们就需要去 子pom.xml文件中的build配置resources
-
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build> -
发现:通过target文件可以发现,无论是在Java目录的properties还是在resources目录下的properties,都被打包到了classes目录下。我们这这个路径为classpath。 思路:需要一个文件流:
// 在properties文件中的配置:
username=root
password=2925672205
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/peng/servlet/aa.properties");
Properties prop = new Properties();
prop.load(resourceAsStream);
String user = prop.getProperty("username");
String pwd = prop.getProperty("password");
//注意,哪怕是使用双引号括起来,标点符号也都是要使用英文的。不然就不能识别,直接就是一个 问号(?)
resp.getWriter().print(user +":"+pwd);
}
访问测试即可ok;
5.6、HttpServletResponse
web服务器接收到客户端的http请求,针对这个请求,分别创建一个
代表请求的HttpServletRequest对象,
代表响应的一个HttpServletResponse;
-
如果要获取客户端请求过来的参数:找HttpServletRequest
-
如果要给客户端响应一些信息:找HttpServletResponse
-
//设置浏览器的行为(浏览器的各种信息响应),就需要使用resp这个对象来进行操作。
1、简单分类
-
负责向浏览器发送数据的方法
//写数据流的数据:
servletOutputstream getOutputstream() throws IOException;
//写中文的数据:
Printwriter getwriter() throws IOException;
-
负责向浏览器发送响应头的方法
void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String varl,long var2)
void addDateHeader(String var1,long var2)
void setHeader(String var1,String var2);
void addHeader(String var1,String var2);
void setIntHeader(String var1,int var2);
void addIntHeader(String varl,int var2);
-
响应的状态码
public static final int SC_CONTINUE = 100;
public static final int SC_SWITCHING_PROTOCOLS = 101;
public static final int SC_OK = 200;
public static final int SC_CREATED = 201;
public static final int SC_ACCEPTED = 202;
public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
public static final int SC_NO_CONTENT = 204;
public static final int SC_RESET_CONTENT = 205;
public static final int SC_PARTIAL_CONTENT = 206;
public static final int SC_MULTIPLE_CHOICES = 300;
public static final int SC_MOVED_PERMANENTLY = 301;
public static final int SC_MOVED_TEMPORARILY = 302;
public static final int SC_FOUND = 302;
public static final int SC_SEE_OTHER = 303;
public static final int SC_NOT_MODIFIED = 304;
public static final int SC_USE_PROXY = 305;
public static final int SC_TEMPORARY_REDIRECT = 307;
public static final int SC_BAD_REQUEST = 400;
public static final int SC_UNAUTHORIZED = 401;
public static final int SC_PAYMENT_REQUIRED = 402;
public static final int SC_FORBIDDEN = 403;
public static final int SC_NOT_FOUND = 404;
public static final int SC_METHOD_NOT_ALLOWED = 405;
public static final int SC_NOT_ACCEPTABLE = 406;
public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
public static final int SC_REQUEST_TIMEOUT = 408;
public static final int SC_CONFLICT = 409;
public static final int SC_GONE = 410;
public static final int SC_LENGTH_REQUIRED = 411;
public static final int SC_PRECONDITION_FAILED = 412;
public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
public static final int SC_REQUEST_URI_TOO_LONG = 414;
public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
public static final int SC_EXPECTATION_FAILED = 417;
public static final int SC_INTERNAL_SERVER_ERROR = 500;
public static final int SC_NOT_IMPLEMENTED = 501;
public static final int SC_BAD_GATEWAY = 502;
public static final int SC_SERVICE_UNAVAILABLE = 503;
public static final int SC_GATEWAY_TIMEOUT = 504;
public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2、Response常见应用
-
向浏览器输出消息(一直在讲,就不说了)
-
下载文件
-
要获取 所要下载文件 的路径
-
下载的文件名是啥?
-
设置想办法让浏览器能够支持下载我们需要的东西
-
获取下载文件的输入流
-
创建缓冲区
-
获取OutputStream对象
-
将FileOutputStream流写入到bufer缓冲区
-
使用OutputStream将缓冲区中的数据输出到客户端!
-
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 要获取下载文件的路径
String realPath = "D:\Users\Administrator\IdeaProjects\kuangshen\javaweb-05- servlet\servlet3\src\img\天红.jpg";
System.out.println("下载文件的路径:"+realPath);
// 2. 下载的文件名是啥?
String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
// 3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,中文文件名 URLEncoder.encode编码,否则有可能乱码
resp.setHeader("Content- Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
// 4. 获取下载文件的输入流
FileInputStream in = new FileInputStream(realPath);
// 5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// 6. 获取OutputStream对象
ServletOutputStream out = resp.getOutputStream();
// 7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户 端!
while ((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
-
注意1:如果我们的所要下载的文件路径填的是获取当前目录下的路径,那么就会找不到文件。因为我们启动Tomcat时,下载路径是Tomcat所在目录下的路径。路径不对,所以找不到文件!
-
注意2:在写绝对路径时,需要使用双引号括起来,并且每一节路劲使用双斜线来进行分割
-
-
注意3:
-
注意4:此外,我们的下载文件名如果是中文的,那么就需要变成中文编码。不然下载的时候名字是无法识别的(虽然也是可以下载,但是名字有问题)。
3. 验证码功能
验证怎么来的?
-
前端实现(使用JS来实现)
-
后端实现,需要用到Java的图片类,生成一个图片
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//第一,设置浏览器刷新时间的间隔。这里设置3秒刷新一次
resp.setHeader("refresh","3");
//第二,在内存中创建一个图片
BufferedImage image = new BufferedImage(100, 50, BufferedImage.TYPE_INT_RGB);
//1,得到图片,构建一个“画笔”
Graphics2D pen = (Graphics2D) image.getGraphics();
//2,设置图片的背景颜色
pen.setColor(Color.white);
pen.fillRect(0,0,100,50);
//3,给图片写数据
pen.setColor(Color.BLUE);
pen.setFont(new Font(null,Font.BOLD,30));
pen.drawString(makeNum(),0,30);
//第三,告诉浏览器,我们的请求(也就是输入的URL)以图片的方式显示出来。
resp.setContentType("image/jpeg");
//第四,网站存在缓存,而不是浏览器来缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-Control","no-cache");
resp.setHeader("Pragma","no-cache");
//将图片写给浏览器
ImageIO.write(image,"jpg",resp.getOutputStream());
}
private String makeNum(){
Random random = new Random();
String num = random.nextInt(9999999)+"";
StringBuffer sb = new StringBuffer();
for (int i=0; i<7-num.length(); i++){
sb.append("0");
}
num = sb.toString() + num;
return num;
}
4.实现重定向
-
重定向也可以看做是页面转跳跳。当客户端输入地址时,会自动转跳到另一个地址。(比如,登录页面等就是这样的功能)
-
注意:转发只是请求一次;而重定向是请求两次。
常见场景:
-
用户登录
void sendRedirect(String var1) throws IOException;
测试:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 重定向方法拆解:
* 1,resp.setHeader("Location","/r1/image");
* 2,resp.setStatus(302);
* 注意,这里的302是重定向的状态码
*/
//重定向方法:
resp.sendRedirect("/r1/image");
}
-
1,设置(设置前端登录页面)index.jsp页面:
<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径,需要寻找项目的路径--%>
<%--${pageContext.request.contextPath}这个代表当前的项目,推荐--%>
<form action="${pageContext.request.contextPath}/login" method="get">
用户名:<input type="text" name="username"> <br>
密码: <input type="password" name="password"> <br>
<input type="submit">
</form>
</body>
</html>
-
2,编写后端Java可执行程序:
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求:
//这个方法可以获得我们请求的参数:
String username = req.getParameter("username");
String password = req.getParameter("password");
//输出我们获得的请求:
System.out.println(username + ":" + password);
//输出完之后,进行重定向:
resp.sendRedirect("/r1/success.jsp");
}
-
3,定义重定向页面(也就是设置登录后的前端展示页面):
<%@ page contentType="text/html; charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>
-
4,配置Java程序对应的web.xml的文件
<servlet>
<servlet-name>request</servlet-name>
<servlet-class>com.peng.servlet.RequestTest</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>request</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
-
5,导入对应的JSP-API依赖包:
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
5、额外补充:
-
第一个:
5.7、HttpServletRequest
HttpServletRequest代表客户端的请求,用户通过Http协议访问服务器, HTTP请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息;
获取参数,请求转发
index.jsp
<html>
<body>
<h2>Hel1o World!</h2>
<%@ page contentType="text/html; charset=UTF-8"%>
<%--这里超交的路径,需要寻找到项目的路径--%>
<%--${pageContext. request, contextPath}代表当前的项目--%>
<div style="text-align: center">
<form action="${pageContext.request.contextPath}/login" method="post">
用户名: <input type="text" name="username"> <br>
密码: <input type="password" name="password"> <br>
爱好:
<input type="checkbox" name="hobbys" value="女孩">女孩
<input type="checkbox" name="hobbys" value="游戏">游戏
<input type="checkbox" name="hobbys" value="代码">代码
<input type="checkbox" name="hobbys" value="打劫">打劫
<br>
<input type="submit">
</form>
</div>
</body>
</html>
<servlet>
<servlet-name>rd</servlet-name>
<servlet-class>com.kuang.servlet.rd</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rd</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
</web-app>
自己创建类,且需要继承HttpServlet类
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
String[] hobbys = req.getParameterValues("hobbys");
System.out.println("==========");
//后台接收中文乱码问题
System. out.println(username);
System. out.println(password);
// System. out.println(Arrays.toString(hobbys));
System.out.println(Arrays.toString(hobbys));
System. out.println("============");
System. out.println(req.getContextPath());
//通过请求转发
//这里的/代表当前的web应用
req.getRequestDispatcher("/success.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
标签:Web,Java,web,int,final,static,SC,狂神,public 来源: https://www.cnblogs.com/pengjiateng/p/16371999.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。