JavaWeb
Java Web
1. 基本概念
1.1 前言
web开发
- web 网页 www.baidu.com
- 静态web
- html,css
- 提供给所有人看的数据始终不会发生变化
- 动态web
- 淘宝 几乎是所有的网站
- 提供给所有人看的数据始终会发生变化 每个人在不同的时间 不同的地点看到的信息各不相同!
- 技术栈: servlet/ISP ASP PHP
在Java中 动态web资源开发的技术统称为JavaWeb
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
- 它无法和数据库交互(数据无法持久化 用户无法交互)
- web页面无法动态更新 所有用户看到的都是同一个页面
1.4 动态web
页面会动态的展示 “web的页面展示的效果 因人而异”
动态web的缺点
- 假如服务器的动态web资源出现了错误 我们需要重新编写我们的后台程序 重新发布
- 停机维护
动态web的优点
-
web页面可以动态更新 所有用户看到的都是同一个页面
- 轮播图 点击特效 伪动态
- JavaScript[实际开发中 用的非常多]
- VBScript
-
它可以和数据库交互(数据持久化 注册 商品买卖 用户交互…)
2 web服务器
2.1 技术讲解
ASP
-
微软国内最早流行的就是ASP
-
在HTML中嵌入了VB的脚本 ASP+COM
-
在ASP开发中 基本一个页面(基本一个页面都有几千行的业务代码 页面机器混乱)
<h1> <% System.out.println("你好") %> <h1>
-
维护成本太高
-
C#
-
IIS
PHP
- PHP开发速度很快 功能很强大 跨平台 代码很简单
- 无法承载巨大的访问量(局限性) 但是大部分的网站都是中小型
JSP /Servlet
B/S 浏览器和服务器
C/S 客户端和服务器
- sun公司主推的B/S架构
- 基于Java语言(所有的大公司 和一些开元的组件 都是Java写的)
- 可以承载三高问题(高性能 高并发 高性能)
- 语法类似ASP ASP–>JSP 加强市场强度
2.2 web服务器
服务器是一种被动的操作 用来处理用户的一些请求 和给用户一些响应信息
IIS
微软的ASP windows中自带的
Tomcat
Tomcat是Apache 软件基金会的Jakarta 项目中的一个核心项目,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,,成为目前比较流行的Web 应用服务器。
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,目前Tomcat最新版本为9.0.37**。**
下载Tomcat
- 安装 or 解压
- 了解配置文件及目录结构
- 这个东西的作用
3. Tomcat
3.1 安装Tomcat
Tomcat官方:https://tomcat.apache.org/
3.2 Tomcat
文件夹文件说明
启动 关闭Tomcat
访问测试http://localhost:8080/
可能遇到的问题
- Java环境变量没有配置
- 闪退问题需要配置兼容性
- 乱码问题 配置文件中的设置
3.3 Tomcat配置
可以配置启动的端口号
可以配置主机的名称
-
Tomcat默认端口 8080
-
mysql 3306
-
http 80
-
https 443
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
可以配置主机的名称
- 默认的主机名称为 localhost ->127.0.0.1
- 默认网站应用存放位置为 webapps
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
面试题
网站是如何进行访问的
-
输入一个域名
-
检查本机的 C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映射
-
有 返回对应的ip地址
127.0.0.1 www.localhost.com
-
没有去DNS找 找到的话就返回 找不到就返回找不到
-
3.4 发布一个web网站
不会就先模仿
-
将自己写的网站 放到服务器(Tomcat)中指定的web应用的文件夹(webapps)下 就可以访问了问斩应该有的结构了
-- webapps:Tomcat服务器的web目录 --ROOT --lhc 网站的目录名 --WEB-INF -web.xml 网站配置文件 -classes Java程序 -lib web 应用所依赖的jar包 -index.html 默认的首页 -static -css -style.css -js -img -....
4 HTTP
4.1 什么是HTTP
HTTP
HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
- 文本 html 字符串
- 超文本 图片 音乐 视频 定位 地图…
- 端口 80
Https
- 端口 443
4.2 两个时代
-
http1.0
- HTTP/1.0 客户端可以与web服务器连接 只能获得一个web资源 断开连接
-
http2.0
- HTTP/1.1:客户端可以与web服务器连接 能获得多个web资源
4.3 HTTP请求
- 客户端—发请求(Request)—服务器
百度:
Request URL: https://www.baidu.com/ 请求地址
Request Method: GET //get方法 post方法
Status Code: 200 OK //状态码
Remote(远程) Address: 163.177.151.110:443
1.请求行(general)
- 请求行中的请求方式 GET
- 请求方式:Get/post HEAD DELETE PUT
- get 请求能够携带的参数比较少 大小有限制 会在浏览器的URL地址栏显示数据雷人 不安全 但是高效
- post 请求能够携带的参数没有限制 大小没限制 不会在浏览器的URL地址栏显示数据雷人 安全 但是低效
2 消息头(response)
Accept:告诉浏览器 他所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISP8859-1
Accept-Language: 告诉浏览器它的语言环境
Cache-Control:缓冲控制
Connection:告诉浏览器 请求完成是断开还是保持连接
HOST:主机地址
4.4 HTTP响应
- 服务器—响应—客服端
百度:
Cache-Control: private //缓冲控制
Connection: keep-alive //连接
Content-Encoding: gzip
charset=utf-8 //编码
Content-Type: text/html; //类型
Accept: text/html
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9 //语言
Cache-Control: max-age=0
Connection: keep-alive
1. 响应体(request)
Accept:告诉浏览器 他所支持的数据类型
Accept-Encoding: 支持哪种编码格式 GBK UTF-8 GB2312 ISP8859-1
Accept-Language: 告诉浏览器它的语言环境
Cache-Control:缓冲控制
Connection:告诉浏览器 请求完成是断开还是保持连接
HOST:主机地址
Refrush:告诉客户端 多久刷新一次
Location:让网页重写定位
2.响应状态码
200:请求响应成功
3**:请求重定向
- 重定向:重新到我给你的新位置上去
4**:找不到资源
- 资源不存在 404
5**:服务器代码错误 500 502网关错误
常见面试题
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来 经历了什么?
5 Maven
为什么要学习这个技术
- 在javaweb开发中 需要使用大量的jar包 我们要手动导入
- 如何能够让一个东西自动帮我导入这个和配置这个jar包
由此Maven诞生了
5.1 Maven架构管理工具
我们目前用来就是方便导入jar包的
Maven的核心思想 约定大于配置
- 有约束 不要去违反
Maven会规定好你该去如何去编写我们的Java代码 必须按照这个规范来
5.2 下载安装Maven
官方 https://maven.apache.org/
下载完解压即可:
电脑的所有环境最好放一起
5.3 配置环境变量
在我们的系统环境变量中
配置如下
- M2_HOME maven目录下的bin目录
- MAVEN_HOME maven的目录
- 在系统的path中配置 %MAVEN_HOME%\bin
测试是否成功
5.4 阿里云镜像
- mirrors
- 作用 加速我们的下载
- 国内建议使用阿里云的镜像
- https://developer.aliyun.com/article/512821
- https://developer.aliyun.com/article/512821
5.5 本地仓库
在本地的仓库 远程仓库
建立一个本地仓库 (新建文件夹 maven-repo)
5.6 在IDEA中使用Maven
-
启动IDEA
-
等待项目初始化
6.
- IDEA中的Maven设置
- 到这里 Maven就已经配置完成了
5.7 创建一个普通的Maven项目
不选择要导入的maven包 直接创建一个普通的Maven项目
选择了javaweb的项目 这个只有在Web应用下才有
5.8 标记文件夹功能
5.9 在IDEA中配置Tomcat
5.10 pom文件
pom.xml是Maven的核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<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>
<!--这里就是我们刚才配置的GAV-->
<groupId>com.lhc</groupId>
<artifactId>javaweb-01-maven</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Packaging:项目的打包方式
jar:java应用
war:JavaWeb应用
-->
<packaging>war</packaging>
<name>javaweb-01-maven Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认构建编码-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--编码版本-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包配置文件-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
<!--项目构建用的东西-->
<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>
</project>
maven由于他的约定大于配置 我们之后可能遇到我们写的配置文件 无法被导出或者生效的问题 解决方案
<!--在build中配置resources 来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
5.11 IDEA操作
Maven中jar包的联系的关联图
5.12 遇到的问题
1.Maven3.6.2
解决方法 降级为3.6.1
2.Tomcat闪退
配置Tomcat start.bat文件(目前不知道怎么解决)
3.IDEA每次都要重复配置Maven
在IDEA中全局默认配置中去配置
4.maven默认web项目中的web.xml版本问题
替换为wenbapp4.0版本和Tomcat一致
<?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">
<display-name>Welcome to Tomcat</display-name>
<description>
Welcome to Tomcat
</description>
</web-app>
5.Maven项目中无法配置Tomcat
必须要的配置 :为什么会有这个问题 我们访问一个网站 需要制定一个文件夹名字
切记 下面的配置文件是你现在的项目 不是其他的
还有 一定要打开Tomcat服务 不然怎么调整也没用
还有 一定要打开Tomcat服务 不然怎么调整也没用
还有 一定要打开Tomcat服务 不然怎么调整也没用
1.
6.maven仓库的使用
进入官方https://mvnrepository.com/?cf_chl_captcha_tk=a48f18039660094440761e1b6d230ce6a69c55f8-1602326539-0-Afkz8Ted5KWfCo94r18BZ1Np84NIY65dJzT-JICrG8uKuvDHc7d-Vj3KkCSmvqWeivkNh-6pDMkZlW4_GZfollylgMnsz4bsA3sgmXHNuQRa89eW_4iPugscHbCD8MSdAKmS1zgUmaL5HGqMV3I0z3LK351OLOdCVvPbVQ57dGc-17W1Mg-TUEiVQS0hL5JfJi1GioiVogtA28MlXOmYAJAeGAw6_Mbew9qG38W2yGGQZ45voy_d1toUH8IgPY3h-87F-vB378PXe_xno313C-M4asXkOYRzKzn3F6pnmX8cqvQUaCqF1hLgvTocE4Q9V2AtDiXRS5Yd1pTeKOt0iXNsA1Af-5Yt3dxIBi9Mpr8CFTgcPZB–rCU7mdxI7iEq22JYDL8KU_bPEBddTMDztzk6vWvB8bKTLsVbmxb-6yvxT2sIxru83u6Y2oqpvIasLeyAz5p2z5KiwkVDRgg8V900O-OXi2MTwy1h3XXZLCcvguicxaSYruWdBepEITZNXOA_fXDA6R2dPNsnIz8myRet7ZfGvu8o5IYEiL-y64v
6.Servlet
6.1 Servlet简介
- Servlet就是Sun公司开发动态web的一门技术
- Sun公司在这些API中提供了一个接口 Servlet 如果你想开发一个Servlet程序 只需要完成两个小步骤
- 编写一个类 实现Servlet接口
- 把开发好的Java类部署到web服务器中
把实现了Servlet接口的Java程序叫做 Servlet
6.2 HelloServlet
Servlet接口有两个默认的实现类 HttpServlet,GenericServlet
-
构建一个普通Maven项目 删掉里面的src目录 以后我们的学习就在这个项目里面简历moudel 这个空的工程就是Maven的主工程
-
guanyu Maven父子工程的理解:
父项目中会有
<modules> <module>servlet-01</module> </modules>
子项目中会有
<parent> <artifactId>javaweb-02-servlet</artifactId> <groupId>com.lhc</groupId> <version>1.0-SNAPSHOT</version> </parent>
父项目中的java子项目可以直接使用
son extends father
-
Maven环境优化
- 修改web.xml为最新的
- 将maven的结构搭建完整
-
编写一个Servlet程序
-
编写一个普通类
-
实现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.println("hello servlet"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
-
编写Servlet的映射
为什么需要映射 我们写的是java程序 但是要通过浏览器访问
浏览器需要连接web服务器
所以我们需要在web服务器中注册我们写的Servlet
还需要给他一个浏览器能够访问的路径
<!--注册Servlet--> <servlet> <servlet-name>hello</servlet-name> <servlet-class>com.lhc.servlet.HelloServlet</servlet-class> </servlet> <!--Servlet的请求路径--> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
配置Tomcat
注意配置项目发布的路径就可以了
-
启动测试
6.3 Servlet原理
Servlet是由Web服务器调用
web服务器在收到浏览器请求之后 会:
6.4 Mapping问题
-
一个Servlet可以指定一个映射路径(http://localhost:8080/hello)
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello</url-pattern> </servlet-mapping>
-
一个Servlet可以指定多个映射路径(http://localhost:8080/s1/hello1 http://localhost:8080/s1/hello2 http://localhost:8080/s1/hello3 )
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello1</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可以指定通用映射路径(比如访问http://localhost:8080/s1/qwjkejka)
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello/*</url-pattern> </servlet-mapping>
-
默认请求路径(怎么访问都是hello这个servlet)
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>
-
指定一些后缀或者前缀等等…(比如访问http://localhost:8080/s1/dsklajdlkaj.lhc http://localhost:8080/s1/hello1/dasdasjh.lhc )*前面不能写/ 但是只要是最后是.lhc就可以映射到
<servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>*.lhc</url-pattern> </servlet-mapping>
-
优先级问题
指定了固有的映射路径优先级最高 如果找不到就会走默认的处理请求
6.5 ServletContext
web容器在启动的时候,它会为每个web程序都创建一个的ServletContext对象 它代表了当前web应用;
1.共享数据
我在这个Servlet中保存的数据 可以在另外一个Servlet中拿到
设置要拿走的username数据的类
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//this.getInitParameter() 初始化参数
//this.getServletConfig() Servlet配置
//this.getServletContext();Servlet上下文
ServletContext context = this.getServletContext();
String username="林宏程";//数据
context.setAttribute("username",username);//将一个数据保存在了ServletContext 名字为username 值为 林宏程
System.out.println("hello");
}
}
设置一个获取username数据的类
public class GetServlet extends HttpServlet {
@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");//配置content的传输格式
resp.setCharacterEncoding("utf-8");//配置content的编码
resp.getWriter().println("名字"+username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
配置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">
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.lhc.servlet.HelloServlet</servlet-class>
<!-- <init-param>-->
<!-- <param-name></param-name>-->
<!-- <param-value></param-value>-->
<!-- </init-param>-->
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>getc</servlet-name>
<servlet-class>com.lhc.servlet.GetServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getc</servlet-name>
<url-pattern>/getc</url-pattern>
</servlet-mapping>
</web-app>
访问的结果 需要先访问/hello 再访问/getc才能获取到username
2.获取初始化参数
<!-- 配置一些web应用初始化参数-->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
</context-param>
public class ServletDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
String url = context.getInitParameter("url");
resp.getWriter().println(url);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.请求转发
public class ServletDemo04 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = this.getServletContext();
System.out.println("进入了ServletDemo04");
//RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp");//转发的请求路径
//requestDispatcher.forward(req,resp);//调用forward实现请求转发
context.getRequestDispatcher("/gp").forward(req,resp);
}
}
请求转发和重定向的区别
A B C是3个网站 A需要C的数据
请求转发过程
重定向
4.读取资源文件
Properties
- 在java目录下新建Properties
- 在resource目录下新建Properties
发现 都被打包了同一个目录下 classes 我们俗称为classpath(类路径)
但是放在java下的db.properties需要在pom.xml加入
<!--在build中配置resources 来防止我们资源导出失败的问题-->
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
思路 需要一个文件流
username=lhc
password=123456
然后用InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");获取里面的流
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties prop1 = new Properties();
prop1.load(is);
String user1 = prop1.getProperty("username");
String pwd1 = prop1.getProperty("password");
resp.getWriter().println("lhc_username="+user1);
resp.getWriter().println("lhc_password="+pwd1);
InputStream si = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/lhc/servlet/aa.properties");
Properties prop2 = new Properties();
prop2.load(si);
String user2 = prop2.getProperty("username");
String pwd2 = prop2.getProperty("password");
resp.getWriter().println("lt_username="+user2);
resp.getWriter().println("lt_password="+pwd2);
}
访问测试即可
5.假如resource文件夹或者java文件夹打包失败
6.6HttpServletResponse
响应
web服务器接收客户端的http请求 针对这个请求 分别创建一个代表请求的HttpServletRequest 代表响应的一个HttpServletResponse
- 如果要获取客户端请求过来的参数 HttpServletRequest
- 如果要给客户端响应一些信息 HttpServletResponse
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 var1, 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 var1, int var2);
void setStatus(int var1);
响应的状态码
int SC_CONTINUE = 100;
int SC_SWITCHING_PROTOCOLS = 101;
int SC_OK = 200;
int SC_CREATED = 201;
int SC_ACCEPTED = 202;
int SC_NON_AUTHORITATIVE_INFORMATION = 203;
int SC_NO_CONTENT = 204;
int SC_RESET_CONTENT = 205;
int SC_PARTIAL_CONTENT = 206;
int SC_MULTIPLE_CHOICES = 300;
int SC_MOVED_PERMANENTLY = 301;
int SC_MOVED_TEMPORARILY = 302;
int SC_FOUND = 302;
int SC_SEE_OTHER = 303;
int SC_NOT_MODIFIED = 304;
int SC_USE_PROXY = 305;
int SC_TEMPORARY_REDIRECT = 307;
int SC_BAD_REQUEST = 400;
int SC_UNAUTHORIZED = 401;
int SC_PAYMENT_REQUIRED = 402;
int SC_FORBIDDEN = 403;
int SC_NOT_FOUND = 404;
int SC_METHOD_NOT_ALLOWED = 405;
int SC_NOT_ACCEPTABLE = 406;
int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
int SC_REQUEST_TIMEOUT = 408;
int SC_CONFLICT = 409;
int SC_GONE = 410;
int SC_LENGTH_REQUIRED = 411;
int SC_PRECONDITION_FAILED = 412;
int SC_REQUEST_ENTITY_TOO_LARGE = 413;
int SC_REQUEST_URI_TOO_LONG = 414;
int SC_UNSUPPORTED_MEDIA_TYPE = 415;
int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
int SC_EXPECTATION_FAILED = 417;
int SC_INTERNAL_SERVER_ERROR = 500;
int SC_NOT_IMPLEMENTED = 501;
int SC_BAD_GATEWAY = 502;
int SC_SERVICE_UNAVAILABLE = 503;
int SC_GATEWAY_TIMEOUT = 504;
int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
2.常见应用
-
向浏览器输出消息(resp.getWriter().println(“lt_username=”)
-
下载文件
- 要获取下载文件的路径
- 下载的文件名叫什么
- 想办法让浏览器能够支持下载我们需要的东西
- 获取下载文件的输入流
- 创建缓冲区
- 获取OutputStream对象
- 将FileOutputStream流写入到buffer缓冲区
- 使用OutputStream将缓冲器中的数据输出到客户端
mapping不再说明
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1. 要获取下载文件的路径
String realPath ="F:\\JAVA的学习\\6.JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\a.jgp";
System.out.println("下载文件的路径"+realPath);
//2. 下载的文件名叫什么
String fileName = realPath.substring(realPath.lastIndexOf("\\")+1);
//3. 想办法让浏览器能够支持下载我们需要的东西 如果文件有中文 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缓冲区
while((len=in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
//8. 使用OutputStream将缓冲器中的数据输出到客户端
}
3.验证码
验证码怎么来的?
- 前端实现
- 后端实习 需要用到java的图片类 生成一个图片
mapping不再说明
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//如果让浏览器5S刷新一次
resp.setHeader("refresh","3");
//在内存中创建一个图片
BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
//得到图片
Graphics2D g = (Graphics2D)image.getGraphics();//相当于一个笔
//设置图片的背景颜色
g.setColor