竹子建站登录,整合营销传播策略,企业商标图案大全,揭阳做网站目录
一、web服务器
1. 常见web服务器
2. web服务器简介
二、 Apache Tomcat服务器
1. Tomcat服务器简介
2. Tomcat服务器基本使用
3. 启动tomcat常见问题
#xff08;1#xff09;启动tomcat控制台乱码
#xff08;2#xff09;启动tomcat闪退问题
#xff08;…目录
一、web服务器
1. 常见web服务器
2. web服务器简介
二、 Apache Tomcat服务器
1. Tomcat服务器简介
2. Tomcat服务器基本使用
3. 启动tomcat常见问题
1启动tomcat控制台乱码
2启动tomcat闪退问题
3启动报错
4. 如何关闭Tomcat服务器
5. Tomcat文件目录介绍
6. Tomcat服务器部署项目
7. Tomcat web开发项目结构
8. idea创建web项目
9. web项目目录结构说明
三、servlet
1. 什么是servlet
2. servlet 环境搭建
3. 执行原理
4. Servlet3.0
5. servlet debug调试
6. servlet 执行流程
7. servlet 生命周期(重点)
1创建servlet
2执行servlet类中init---初始化方法
3servlet类---service-----执行每次请求
4servlet类---destroy---当我们tomcat容器停止时卸载servlet
8. servlet 多线程存在安全问题
9. servlet 方法介绍
10. servlet 体系结构
11. Servlet相关配置
四、 request与response对象
1. request与response继承模型
2. request获取请求数据
1 获取请求行数据
2获取请求头数据
3获取请求体数据 (Post 才有)
3. request获取请求参数
4. 中文乱码问题
5. request请求转发
6. response响应数据
7. response重定向
1重定向原理
2重定向与转发区别
8. ServletContext对象
五、案例jdbcservlet登录和注册
jdbcservlet用户注册
jdbcservlet用户登录
常见问题 一、web服务器
* 服务器安装了服务器软件的计算机 * 服务器软件接收用户的请求处理请求做出响应 * web服务器软件接收用户的请求处理请求做出响应。 * 在web服务器软件中可以部署web项目让用户通过浏览器来访问这些项目 * web容器
1. 常见web服务器
Tomcat由Apache组织提供的一种Web服务器提供对jsp和Servlet的支持。它是一种轻量级的javaWeb容器服务器也是当前应用最广的JavaWeb服务器免费。
Jboss是一个遵从JavaEE规范的、开放源代码的、纯Java的EJB服务器它支持所有的JavaEE规范免费。
GlassFish 由Oracle公司开发的一款JavaWeb服务器是一款强健的商业服务器达到产品级质量应用很少收费。
Resin是CAUCHO公司的产品是一个非常流行的应用服务器 的支持性能也比较优良resin自身采用JAVA语言开发收费应用比较多。
WebLogic是Oracle公司的产品是目前应用最广泛的Web服务器支持JavaEE规范而且不断的完善以适应新的开发要求适合大型项目收费用的不多适合大公司。 2. web服务器简介
1web服务器 底层是 基于tcp协议封装 http协议实现、springboot框架 底层内嵌入我们的 Tomcat服务
2web服务器是一个应用程序(软件)对http协议的进行封装让web开发更加便捷。
手写http服务器框架底层是基于socket tcp实现。 二、 Apache Tomcat服务器
1. Tomcat服务器简介
1tomcat下载地址Apache Tomcat® - Apache Tomcat 10 Software Downloads
2Apache Tomcat最早是由Sun Microsystems开发的一个Servlet容器在1999年被捐献给ASFApache Software Foundation隶属于Jakarta项目现在已经独立为一个顶级项目。Tomcat主要实现了Java EE中的Servlet、JSP规范同时也提供HTTP服务是市场上非常流行的Java Web容器。
2. Tomcat服务器基本使用 1下载http://tomcat.apache.org/ 2安装解压压缩包即可。 注意 tomcat解压安装位置 不要带中文、不要带任何空格路径。纯英文路径下运行tomcat。 3 卸载删除目录就行了 4启动bin文件夹例如启动tomcat 或者停止tomcat --------可执行文件 * bin/startup.bat ,双击运行该文件即可 *.bat---运行在windows批处理文件 *.sh-----linux环境中运行文件 tomcat 启动之后默认端口号码8080 5访问浏览器输入http://localhost:8080 回车访问自己 http://别人的ip:8080 访问别人 3. 启动tomcat常见问题
1启动tomcat控制台乱码
双击启动startup.bat 解决
D:\path\Tomcat\tomcat10\apache-tomcat-10.0.20-windows-x64\apache-tomcat-10.0.20\conf
logging.properties 删除掉再重新启动
2启动tomcat闪退问题 黑窗口一闪而过 * 原因 没有正确配置JAVA_HOME环境变量 * 解决方案正确配置JAVA_HOME环境变量
3启动报错 a. 暴力找到占用的端口号并且找到对应的进程杀死该进程 * netstat -ano b. 温柔修改自身的端口号 找到tomcat目录/conf/server.xml 修改port的值将port端口的值修改为80 * 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。 * 好处在访问时就不用输入端口号
4. 如何关闭Tomcat服务器
第一种CtrlC键 关闭Tomcat服务器
第二种点击Tomcat窗口的右上角关闭按钮 暴力停止服务器
第三种找到tomcat目录/shutdown.bat文件双击执行关闭Tomcat。 5. Tomcat文件目录介绍
1bin主要存放tomcat的操作命令根据操作系统可以分为两大类一是以.bat结尾Windows二是以.sh结尾Linux。比如可以通过startup启动shutdown关闭Tomcat。
2conf全局配置文件logging.properties 修改tomcat启动端口号码
一个策略文件catalina.policy 定义了安全策略。
两个属性文件catalina.properties 和 logging.properties 。
四个XML配置文件
server.xmlTomcat的主要配置文件配置整个服务器信息如修改连接器端口号默认为8080。不能动态重加载文件修改之后必须重启服务器才能生效。
web.xml全局的web应用程序部署描述文件如可以设置tomcat支持的文件类型。
context.xmlTomcat的一些特定配置项针对所有应用程序生效。
tomcat-users.xml配置Tomcat的用户名、密码管理身份验证以及访问控制权限。
3libTomcat运行依赖的一些Jar文件比如常见的servlet-api.jar、jsp-api.jar。所有的应用程序可用可以放置一些公用的Jar文件如MySQL JDBC驱动mysql-connector-java-5.1.{xx}-bin.jar。
4logs运行中产生的日志文件。包含引擎engine日志文件 Catalina.{yyyy-mm-dd}.log主机日志文件localhost.{yyyy-mm-dd}.log以及一些其他应用日志文件如manager、host-manager。访问日志也保存在此目录下。
5temp临时文件目录清空不会影响Tomcat运行
6webapps存放运行程序 部署war包、jar包、静态资源。
默认就是查找tomcat webapps 目录中项目文件夹中 index.html
默认的应用程序根目录Tomcat启动时会自动加载该目录下的应用程序可以以文件夹、war包、jar包的形式发布启动时会自动解压成相应的文件夹。也可以把应用程序放置在其他路径下需要在文件中配置路径映射。
7work用来存放tomcat在运行时的编译后文件如JSP编译后的文件。清空work目录然后重启tomcat可以达到清除存的作用。
bin可以执行文件。conftomcat服务器的配置文件libtomcat启动后需要依赖的jar包logstomcat工作之后的日志文件webapps是tomcat部署工程的目录。workjsp文件在被翻译之后保存在当前这个目录下session对象被序列化之后保存的位置
6. Tomcat服务器部署项目
方式1 直接将项目放到webapps目录下即可。 * /hello项目的访问路径--虚拟目录 * 简化部署将项目打成一个war包再将war包放置到webapps目录下。 * war包会自动解压缩
方式2在tomcat目录/conf/server.xml 配置
在Host标签体中配置 Context docBaseD:\hello path/hehe / * docBase:项目存放的路径 * path虚拟目录
Context path”浏览器要访问的目录---虚拟目录” docBase网站所在磁盘目录”/ 方式3在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写 Context docBaseD:\hello / * 虚拟目录xml文件的名称
方式4webapps目录下/ROOT工程的访问
当我们在浏览器中直接输入http://ip地址:端口号 那么 默认访问的是Tomcat目录/webapps/ROOT目录如果webapps下面有一个ROOT的项目。那么在访问的时候直接可以省略项目的名字/ 表示找到root目录
----tomcat欢迎页面部署 ----webapps root 目录中 7. Tomcat web开发项目结构
1idea 先创建一个普通java项目
2在将该java项目 变成web项目
3整合tomcat 8. idea创建web项目
1选择创建项目 2创建java项目 3填写项目名称 4新增 add framework support 5选择web application 6多了web-inf文件夹 7新增tomcat 8点击新增tomcat 9选择tomcat server 10添加tomcat 路径 11添加当前java项目 12点击运行项目 13自动弹出界面 9. web项目目录结构说明
web项目结构
src------java代码 核心的配置文件例如 spring配置文件等 servlet
web-----静态资源 或者jsp等
html--html、js、css、images等 静态资源 外部都可以直接访问的。
web-inf ------外界是无法访问的。
web.xml------servlet相关配置
index.jsp 三、servlet
1. 什么是servlet
Servlet定义Servlet是基于Java技术的Web组件由容器管理并产生动态的内容。Servlet与客户端通过Servlet容器实现的请求/响应模型进行交互。
概念运行在服务器端的小程序 * Servlet就是一个接口定义了Java类被浏览器访问到(tomcat识别)的规则。 * 将来我们自定义一个类实现Servlet接口复写方法。
springmvc----底层基于Servlet
演示代码
http://localhost:8081/mayikt_tomcat04_war_exploded/mayikt?userNamemayikt
WebServlet(/mayikt)
public class IndexServlet implements Servlet {Overridepublic void init(ServletConfig servletConfig) throws ServletException {}Overridepublic ServletConfig getServletConfig() {return null;}Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {String userName servletRequest.getParameter(userName);servletResponse.setContentType(text/html;charsetutf-8);PrintWriter writer servletResponse.getWriter();if (mayikt.equals(userName)) {writer.println(可以访问);} else {writer.println(无法访问);}writer.close();}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}2. servlet 环境搭建
1在我们的项目中创建libs目录存放第三方的jar包
2项目中导入servlet-api.jar libs目录中
就在我们tomcat安装的目录 中 lib 目录中
servlet-api.jar 讲完课之后上传到 文档中可以直接下载
3创建servlet包 专门存放就是我们的servlet
4创建IndexServlet 实现Servlet 重写方法
5IndexServlet 类上加上WebServlet/mayikt注解定义 URL访问的路径
6重写Servlet 类中service 在service中编写 动态资源
WebServlet(/mayikt)
public class IndexServlet implements Servlet {/*** param servletConfig* throws ServletException*/Overridepublic void init(ServletConfig servletConfig) throws ServletException {}Overridepublic ServletConfig getServletConfig() {return null;}/*** tomcat启动完成* 127.0.0.1:8080/项目名称/mayikt 执行 service 通过service方法获取servletRequest、servletResponse** param servletRequest* param servletResponse* throws ServletException* throws IOException*/Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println(mayikt644);// 需要通过servletRequest对象获取到客户端传递参数到服务器端String userName servletRequest.getParameter(userName);PrintWriter writer servletResponse.getWriter();if (mayikt.equals(userName)) {// 返回数据 okwriter.println(ok);} else {// failwriter.println(fail);}writer.close();// 关闭资源}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}3. 执行原理 1 当服务器接受到客户端浏览器的请求后会解析请求URL路径获取访问的Servlet的资源路径 2查找web.xml文件是否有对应的url-pattern标签体内容。 3如果有则在找到对应的servlet-class全类名 4tomcat会将字节码文件加载进内存并且创建其对象 5 调用其方法
4. Servlet3.0
传统xml方式配置Servlet在web.xml中配置!--配置Servlet --servletservlet-namedemo1/servlet-nameservlet-classcn.itcast.web.servlet.ServletDemo1/servlet-class/servletservlet-mappingservlet-namedemo1/servlet-nameurl-pattern/demo1/url-pattern/servlet-mapping * 好处 * 支持注解配置。可以不需要web.xml了。 * 步骤 1. 创建JavaEE项目选择Servlet的版本3.0以上可以不创建web.xml 2. 定义一个类实现Servlet接口 3. 复写方法 4. 在类上使用WebServlet注解进行配置 * WebServlet(资源路径)
5. servlet debug调试
养成习惯 学会通过 debug模式 运行项目---非常重要
f8---下一步
f9---跳到下一个断点 6. servlet 执行流程
注意servleturl 映射路径不要重复
1servlet是由我们的 web服务器tomcat创建、该方法是由我们的 web服务器tomcat调用
断点分析 2tomcat服务器执行到servlet中的service方法是因为我们创建的servlet实现httpservlet接口 重写了service方法
7. servlet 生命周期(重点)
1创建servlet
选择创建servlet
如果是第一次访问servlet 才会创建servlet ---优点
第一次访问到servlet 单例模式 线程安全问题
先创建servlet
在执行service方法
该servlet 创建好了以后 在jvm内存中只会存在一份。
如果是第二次访问servlet
在执行service方法 提前创建servlet
或者当你第一次访问servlet 创建servlet 对象
提前创建servlet ----优点可以 第一次访问的时候就不需要创建
servlet 对象可以提高效率、但是 项目启动时提前创建servlet
这样就会导致tomcat启动变得比较慢了。 浪费内存--- 创建Servlet实例web容器负责加载Servlet当web容器启动时或者是在第一次使用这个Servlet时容器会负责创建Servlet实例但是用户必须通过部署描述符web.xml指定Servlet的位置或者在类上加上WebServlet成功加载后web容器会通过反射的方式对Servlet进行实例化。WebServlet(urlPatterns /mayiktmeite,loadOnStartup 1)负数---第一次被访问时创建Servlet对象 WebServlet(urlPatterns /mayiktmeite,loadOnStartup -1)0或者正数服务器启动时创建Servlet对象 数字越小优先级越高MeiteServlet loadOnStartup 1YushengjunServlet loadOnStartup 2底层会根据loadOnStartup 从0开始值排序 越小越优先加载创建
2执行servlet类中init---初始化方法
当我们的servlet类被创建时执行servlet类初始化方法init 代码初始化
该方法只会执行一次。 WEB容器调用Servlet的init()方法对Servlet进行初始化在Servlet实例化之后Servlet容器会调用init()方法来初始化该对象
主要是为了让Servlet对象在处理客户请求前可以完成一些初始化的工作
例如建立数据库的连接获取配置信息等。对于每一个Servlet实例init()方法只能被调用一次。
init()方法有一个类型为ServletConfig的参数Servlet容器通过这个参数向Servlet传递配置信息。
Servlet使用ServletConfig对象从Web应用程序的配置信息中获取以名-值对形式提供的初始化参数。
另外在Servlet中还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象
使用该对象Servlet可以和它的Servlet容器进行通信。无论有多少客户机访问Servlet
都不会重复执行init()。 3servlet类---service-----执行每次请求
每次客户端发送请求达到服务器端 都会执行到 servlet类service方法 Servlet初始化之后将一直存在于容器中service()响应客户端请求a. 如果客户端发送GET请求容器调用Servlet的doGet方法处理并响应请求b. 如果客户端发送POST请求容器调用Servlet的doPost方法处理并响应请求c. 或者统一用service()方法处理来响应用户请求service()是Servlet的核心负责响应客户的请求。每当一个客户请求一个HttpServlet对象
该对象的Service()方法就要调用而且传递给这个方法一个“请求”ServletRequest对象和
一个“响应”ServletResponse对象作为参数。在HttpServlet中已存在Service()方法。
默认的服务功能是调用与HTTP请求的方法相应的do功能。要注意的是在service()方法被容器调用之前
必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象类型为ServletRequest
和一个用于对客户端进行响应的响应对象类型为ServletResponse作为参数传递给service()方法。
在service()方法中Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息
在对请求进行处理后调用ServletResponse对象的方法设置响应信息。
4servlet类---destroy---当我们tomcat容器停止时卸载servlet
存放销毁相关代码 WEB容器决定销毁Servlet时先调用Servlet的destroy()方法
通常在关闭web应用之前销毁Servletdestroy()仅执行一次在服务器端停止且卸载Servlet时执行该方法。
当容器检测到一个Servlet对象应该从服务中被移除的时候容器会调用该对象的destroy()方法
以便让Servlet对象可以释放它所使用的资源保存数据到持久存储设备中
例如将内存中的数据保存到数据库中关闭数据库的连接等。当需要释放内存或者容器关闭时
容器就会调用Servlet对象的destroy()方法。在Servlet容器调用destroy()方法前
如果还有其他的线程正在service()方法中执行容器会等待这些线程执行完毕或等待服务器
设定的超时值到达。
一旦Servlet对象的destroy()方法被调用容器不会再把其他的请求发送给该对象。
如果需要该Servlet再次为客户端服务容器将会重新产生一个Servlet对象来处理客户端的请求。
在destroy()方法调用之后容器会释放这个Servlet对象在随后的时间内
该对象会被Java的垃圾收集器所回收。
8. servlet 多线程存在安全问题
servlet 对象默认是单例 在jvm内存中只会存在一份
当多个线程如果共享到同一个全局变量可能会存在线程安全性问题
需求需要统计 你是第一个人访问网站
WebServlet(/count)
public class CountServlet implements Servlet {private Integer count 1;public CountServlet() {System.out.println(CountServlet 对象被创建);}Overridepublic void init(ServletConfig servletConfig) throws ServletException {}Overridepublic ServletConfig getServletConfig() {return null;}Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {servletResponse.setContentType(text/html;charsetutf-8);PrintWriter writer servletResponse.getWriter();writer.println(您是第 count 个人访问网站!);try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}writer.close();synchronized (this) {count;}}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}9. servlet 方法介绍
Servlet接口定义了5种方法
init()
service()
destroy()
getServletConfig()
getServletInfo()
1init()
在Servlet实例化后Servlet容器会调用init()方法来初始化该对象主要是为了让Servlet对象在处理客户请求前可以完成一些初始化工作例如建立数据库的连接获取配置信息等。对于每一个Servlet实例init()方法只能被调用一次。init()方法有一个类型为ServletConfig的参数Servlet容器通过这个参数向Servlet传递配置信息。Servlet使用ServletConfig对象从Web应用程序的配置信息中获取以名-值对形式提供的初始化参数。另外在Servlet中还可以通过ServletConfig对象获取描述Servlet运行环境的ServletContext对象使用该对象Servlet可以和它的Servlet容器进行通信。
2service()
容器调用service()方法来处理客户端的请求。要注意的是在service()方法被容器调用之前必须确保init()方法正确完成。容器会构造一个表示客户端请求信息的请求对象类型为ServletRequest和一个用于对客户端进行响应的响应对象类型为ServletResponse作为参数传递给service()。在service()方法中Servlet对象通过ServletRequest对象得到客户端的相关信息和请求信息在对请求进行处理后调用ServletResponse对象的方法设置响应信息。
3destroy
当容器检测到一个Servlet对象应该从服务中被移除的时候容器会调用该对象的destroy()方法以便让Servlet对象可以释放它所使用的资源保存数据到持久存储设备中例如将内存中的数据保存到数据库中关闭数据库的连接等。当需要释放内存或者容器关闭时容器就会调用Servlet对象的destroy()方法在Servlet容器调用destroy()方法前如果还有其他的线程正在service()方法中执行容器会等待这些线程执行完毕或者等待服务器设定的超时值到达。一旦Servlet对象的destroy()方法被调用容器不回再把请求发送给该对象。如果需要改Servlet再次为客户端服务容器将会重新产生一个Servlet对象来处理客户端的请求。在destroy()方法调用之后容器会释放这个Servlet对象在随后的时间内该对象会被java的垃圾收集器所回收。
4getServletInfo()
返回一个String类型的字符串其中包括了关于Servlet的信息例如作者、版本和版权。该方法返回的应该是纯文本字符串而不是任何类型的标记。
5getServletConfig()
该方法返回容器调用init()方法时传递给Servlet对象的ServletConfig对象ServletConfig对象包含了Servlet的初始化参数。
WebServlet(urlPatterns /servletConfig, initParams {WebInitParam(name p1, value mayikt)})
public class ServletConfigServlet implements Servlet {private ServletConfig servletConfig;Overridepublic void init(ServletConfig servletConfig) throws ServletException {this.servletConfig servletConfig;}Overridepublic ServletConfig getServletConfig() {return servletConfig;}Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {String value getServletConfig().getInitParameter(p1);PrintWriter writer servletResponse.getWriter();writer.println(value);writer.close();}Overridepublic String getServletInfo() {return null;}Overridepublic void destroy() {}
}10. servlet 体系结构 * GenericServlet将Servlet接口中其他的方法做了默认空实现只将service()方法作为抽象* 将来定义Servlet类时可以继承GenericServlet实现service()方法即可* HttpServlet对http协议的一种封装简化操作1. 定义类继承HttpServlet2. 复写doGet/doPost方法
11. Servlet相关配置 urlpartten:Servlet访问路径1. 一个Servlet可以定义多个访问路径 WebServlet({/d4,/dd4,/ddd4})2. 路径定义规则1 /xxx路径匹配2 /xxx/xxx:多层路径目录结构3*.do扩展名匹配
四、 request与response对象
request: 获取客户端发送数据给服务器端
response返回对应的数据给客户端浏览器
http协议基于 请求(request)与响应的模型(response)
WebServlet(/servletDemo05)
public class ServletDemo05 extends HttpServlet {/*** 获取到HttpServletRequest、HttpServletResponse对象** param req* param resp* throws ServletException* throws IOException*/Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// req 获取到客户端发送数据给服务器// http://localhost:8081/mayikt_tomcat04_war_exploded/servletDemo05?userNamemayiktuserPwd123String userName req.getParameter(userName);//userNamemayiktString userPwd req.getParameter(userPwd);//userPwd123456PrintWriter writer resp.getWriter();// 判断用户传递的 用户名称和密码 如果是为zhangsan 644064 则 登录成功if (zhangsan.equals(userName) 644064.equals(userPwd)) {// 服务器端处理完数据之后 返回对应的数据给客户端 告诉给客户端说 响应的是一个 html或者是文本resp.setHeader(Content-Type, text/html;charsetUTF-8);writer.write(html meta charset\utf-8\/bodyh1恭喜您登录成功,用户名称是: userName /h1/body/html);} else {writer.write(htmlmeta charset\utf-8\/bodyh1很遗憾密码错误/h1/body/html);}// 关闭资源writer.close();}
}1. request与response继承模型
ServletRequest ------ 接口 java提供的请求对象根接口
HttpServletRequest ------ 接口继承ServletRequest java提供的对http协议封装请求对象接口
org.apache.catalina.connnector.RequestFacade —— 类Tomcat编写的实现HttpServletRequest 2. request获取请求数据
1 获取请求行数据 a. 获取请求方式 GET * String getMethod() b. (*)获取虚拟目录/day14 * String getContextPath() c. 获取Servlet路径: /demo1 * String getServletPath() d. 获取get方式请求参数namezhangsan * String getQueryString() e. (*)获取请求URI/day14/demo1 * String getRequestURI(): /day14/demo1 * StringBuffer getRequestURL() :http://localhost/day14/demo1 * URL:统一资源定位符 http://localhost/day14/demo1 中华人民共和国 * URI统一资源标识符 : /day14/demo1 共和国 f. 获取协议及版本HTTP/1.1 * String getProtocol() g. 获取客户机的IP地址 * String getRemoteAddr()
2获取请求头数据 * String getHeader(String name):通过请求头的名称获取请求头的值 * EnumerationString getHeaderNames():获取所有的请求头名称
3获取请求体数据 (Post 才有) * 请求体只有POST请求方式才有请求体在请求体中封装了POST请求的请求参数 * 步骤 a. 获取流对象 * BufferedReader getReader()获取字符输入流只能操作字符数据 * ServletInputStream getInputStream()获取字节输入流可以操作所有类型数据 b. 再从流对象中拿数据 3. request获取请求参数
不论get还是post请求方式都可以使用下列方法来获取请求参数 a. String getParameter(String name):根据参数名称获取参数值 usernamezspassword123 b. String[] getParameterValues(String name):根据参数名称获取参数值的数组 hobbyxxhobbygame c. EnumerationString getParameterNames():获取所有请求的参数名称 d. MapString,String[] getParameterMap():获取所有参数的map集合
?age18age22
MapString, String[] map req.getParameterMap();
for(String key : map.keySet()){System.out.print(key :);String[] values map.get(key);for(String value : values){System.out.print(value );}System.out.println();
}WebServlet(/httpServletDemo06)
public class HttpServletDemo06 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {this.doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {// 判断请求是get还是post请求String method req.getMethod();String parameters null;switch (method) {case GET:parameters req.getQueryString();break;case POST:BufferedReader reader req.getReader();parameters reader.readLine();reader.close();break;}HashMapString, String parametersMap new HashMap();String[] sp1 parameters.split();for (int i 0; i sp1.length; i) {String[] sp2 sp1[i].split();String key sp2[0];String value sp2[1];parametersMap.put(key, value);}System.out.println(parametersMap);}
}
1
4. 中文乱码问题 * get方式tomcat 8 已经将get方式乱码问题解决了 * post方式会乱码 * 解决浏览器请求的数据乱码在获取参数前设置request的编码 req.setCharacterEncoding(UTF-8); * 解决响应返回浏览器的数据乱码在响应返回参数前设置response的编码 resp.setContentType(text/html;charsetUTF-8); 5. request请求转发 请求转发:一种在服务器内部的资源跳转方式
(1) 步骤 a.通过request对象获取请求转发器对象 :
RequestDispatcher getRequestDispatcher(String path) b.使用RequestDispatcher对象来进行转发:
forward(ServletRequest request, ServletResponse response)
RequestDispatcher requestDispatcher request.getRequestDispatcher(/requestDemo6);requestDispatcher.forward(request,response);
2特点
浏览器地址栏路径不发生变化只能转发到当前服务器内部资源中转发是一次请求
3request.setAttribute(name,value) 数据共享 共享数据* 域对象一个有作用范围的对象可以在范围内共享数据* request域代表一次请求的范围一般用于请求转发的多个资源中共享数据* 方法1. void setAttribute(String name,Object obj):存储数据2. Object getAttitude(String name):通过键获取值3. void removeAttribute(String name):通过键移除键值对* 注意这个放于forward方法的上面不然响应太快会导致无法获取信息获取ServletContext* ServletContext getServletContext()
有效范围是一个请求范围不发送请求的界面无法获取到value的值jsp界面获取使用EL表达式${num}
只能在一个request内有效如果重定向客户端将取不到值。
request在当次的请求的URL之间有效比如你在请求某个servlet那么你提交的信息可以使用request.getAttribute()方式获得而当你再次跳转之后这些信息将不存在。
WebServlet(/httpServletDemo09)
public class HttpServletDemo09 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {req.setAttribute(name, mayikt);req.getRequestDispatcher(/httpServletDemo10).forward(req, resp);}
}package com.mayikt.servlet;import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;import java.io.IOException;WebServlet(/httpServletDemo10)
public class HttpServletDemo10 extends HttpServlet {Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {doPost(req, resp);}Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {String name (String) req.getAttribute(name);System.out.println(name);System.out.println(httpServletDemo10);}
}6. response响应数据
response是Servlet.service方法的一个参数类型为javax.servlet.http.HttpServletResponse。在客户端发出每个请求时服务器都会创建一个response对象并传入给Servlet.service()方法。response对象是用来对客户端进行响应的这说明在service()方法中使用response对象可以完成对客户端的响应工作。 1. 设置响应行1. 格式HTTP/1.1 200 ok2. 设置状态码setStatus(int sc) 2. 设置响应头setHeader(String name, String value) 3. 设置响应体* 使用步骤1. 获取输出流* 字符输出流PrintWriter getWriter()* 字节输出流ServletOutputStream getOutputStream()2. 使用输出流将数据输出到客户端浏览器
//设置服务端的编码resp.setCharacterEncoding(UTF-8);//通过设置响应头设置客户端浏览器的编码resp.setHeader(Content-type,text/html;utf-8);//这个方法可以同时设置客户端和服务端因为它会调用setCharacterEncoding方法resp.setContentType(text/html;charsetutf-8);
响应格式分为3个部分
1响应行响应数据第一行 http协议版本1.1版本
200表示响应状态码 ok为 成功状态
2响应头第二行开始 格式 key value
3响应体
response是响应对象向客户端输出响应正文响应体可以使用response的响应流repsonse一共提供了两个响应流对象
PrintWriter out response.getWriter()获取字符流ServletOutputStream out response.getOutputStream()获取字节流如果响应正文内容为字符那么使用response.getWriter()如果响应内容是字节
例如下载时那么可以使用response.getOutputStream()。
//设置错误的响应码resp.setError(404,未找到请求的资源);//设置正确的响应码resp.setStatus(200); HttpServletResponse与ServletResponse
ServletResponse--- 接口 java提供的响应对象根接口HttpServletResponse --- 接口继承ServletResponse java提供的对http协议封装响应对象接口org.apache.catalina.connnector.ResponseFacade —— 类Tomcat编写的实现HttpServletResponse
7. response重定向
1重定向原理
当我们的客户端发送请求达到服务器端我们的服务器端响应状态码302 同时在响应头中
设置重定向地址resp.setHeader(Location,www.mayikt.com);
客户端浏览器收到结果之后在浏览器解析Location www.mayikt.com 在直接重定向到
www.mayikt.com
首先客户浏览器发送http请求当web服务器接受后发送302状态码响应及对应新的location给客户端浏览器客户浏览器发现是302响应则自动再发送一个新的http请求请求url是新的location 地址服务器根据此请求寻找资源并发送给客户。
void sendRedirect(String location) 使用指定的重定向位置URL向客户端发送临时重定向响应resp.setStatus(302);
resp.setHeader(Location,www.mayikt.com);
1重定向是两次请求不能使用request对象来共享数据重定向之后浏览器地址栏的URL会发生改变2重定向过程中会将前面Request对象销毁然后创建一个新的Request对象3重定向的URL可以是其它项目工程即可以访问其他站点(服务器)的资源
2重定向与转发区别
1.转发只能将请求转发给同一个web应用项目工程中的其他组件servlet程序
重定向可以重定向到任意的地址网络地址或是文件地址跨项目文件夹 www.mayikt.com2.重定向访问结束后浏览器地址栏URL发生变化变成了重定向后的URL转发则不变重定向对浏览器的请求直接做出响应结果就是告诉浏览器去重新发出另一个新的URL访问请求
请求转发在服务器端内部将请求转发给另一个资源浏览器不知道服务器程序内部发生了转发过程3.请求转发调用者与被调用者之间共享相同的请求对象属于同一个请求和响应过程
重定向则是不同的请求和响应过程 8. ServletContext对象
1 概念代表整个web应用可以和程序的容器(服务器)来通信2获取1. 通过request对象获取request.getServletContext();2. 通过HttpServlet获取this.getServletContext();
req.getServletContext() org.apache.catalina.core.ApplicationContextFacade7922f5a8
this.getServletContext() org.apache.catalina.core.ApplicationContextFacade7922f5a8
3功能1. 获取MIME类型* MIME类型:在互联网通信过程中定义的一种文件数据类型* 格式 大类型/小类型 text/html image/jpeg
* 获取String getMimeType(String file) 2. 域对象共享数据1. setAttribute(String name,Object value)2. getAttribute(String name)3. removeAttribute(String name)
* ServletContext对象范围所有用户所有请求的数据3. 获取文件的真实(服务器)路径1. 方法String getRealPath(String path) String b context.getRealPath(/b.txt);//web目录下资源访问System.out.println(b);String c context.getRealPath(/WEB-INF/c.txt);//WEB-INF目录下的资源访问System.out.println(c);String a context.getRealPath(/WEB-INF/classes/a.txt);//src目录下的资源访问System.out.println(a);
System.out.println( req.getServletContext().getRealPath(/loginServlet));
//F:\扬州软件园\02_JavaWeb\07_TomcatServlet\作业\login-tomcat\out\artifacts\login_tomcat_war_exploded\loginServlet
五、案例jdbcservlet登录和注册
初始化数据库表结构
CREATE TABLE mayikt_users (id int NOT NULL AUTO_INCREMENT,userName varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL,userPwd varchar(255) DEFAULT NULL,PRIMARY KEY (id)
) ENGINEInnoDB DEFAULT CHARSETutf8mb3;
jdbcservlet用户注册 1.添加jar包
commons-lang3-3.4----常用工具包
mysql-connector-java-8.0.13.jar ----mysql驱动包
servlet-api.jar ----servlet-api.jar 该jar上传 该位置--- 点击下载jar包
文档javaweb开发相关资料下载.note
链接有道云笔记
2. jdbc工具类
public class MayiktJdbcUtils {/*** 1.需要将我们的构造方法私有化 ---工具类 不需要 new出来 是通过类名称.方法名称访问*/private MayiktJdbcUtils() {}/*** 2.定义工具类 需要 声明 变量*/private static String driverClass;private static String url;private static String user;private static String password;/***3.使用静态代码快 来给我们声明好 jdbc变量赋值读取config.properties*/static {try {// 1.读取config.properties IO 路径 相对路径InputStream resourceAsStream MayiktJdbcUtils.class.getClassLoader().getResourceAsStream(config.properties);// 2.赋值给我们声明好的变量Properties properties new Properties();properties.load(resourceAsStream);driverClass properties.getProperty(driverClass);url properties.getProperty(url);user properties.getProperty(user);password properties.getProperty(password);// 3.注册驱动类Class.forName(driverClass);} catch (Exception e) {e.printStackTrace();}}/*** 4.封装连接方法*/public static Connection getConnection() throws SQLException {Connection connection DriverManager.getConnection(url, user, password);return connection;}/*** 5.封装释放连接方法 (重载)*/public static void closeConnection(ResultSet resultSet, Statement statement, Connection connection) {// 1.查询 释放连接 resultSet statement connectiontry {if (resultSet ! null)resultSet.close();if (statement ! null)statement.close();if (connection ! null)connection.close();} catch (Exception e) {e.printStackTrace();}}/*** 增删改---释放jdbc资源** param statement* param connection*/public static void closeConnection(Statement statement, Connection connection) {// 1.查询 释放连接 resultSet statement connectioncloseConnection(null, statement, connection);}/*** 开启事务** param connection* throws SQLException*/public static void beginTransaction(Connection connection) throws SQLException {connection.setAutoCommit(false);}/*** 提交事务** param connection* throws SQLException*/public static void commitTransaction(Connection connection) throws SQLException {connection.commit();}/*** 回滚事务** param connection*/public static void rollBackTransaction(Connection connection) {if (connection ! null) {try {connection.rollback();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭事务** param connection*/public static void endTransaction(Connection connection) {if (connection ! null) {try {connection.setAutoCommit(true);} catch (SQLException e) {e.printStackTrace();}}}}拷贝 config.properties
driverClasscom.mysql.cj.jdbc.Driver
urljdbc:mysql://127.0.0.1:3306/mayikt?serverTimezoneUTC
userroot
passwordroot
3.编写注册 servlet
WebServlet(/register)
public class RegisterServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {PrintWriter writer resp.getWriter();resp.setContentType(text/html;charsetutf-8);//1.获取参数String userName req.getParameter(userName);if (StringUtils.isEmpty(userName)) {writer.print(userName不能为空!);return;}String userPwd req.getParameter(userPwd);if (StringUtils.isEmpty(userPwd)) {writer.print(userPwd不能为空!);return;}Connection connection null;PreparedStatement preparedStatement null;try {connection MayiktJdbcUtils.getConnection();//2.验证用户名称和密码MayiktJdbcUtils.beginTransaction(connection);// 开启事务String insertSql INSERT INTO mayikt.mayikt_users (id, userName, userPwd) VALUES (null, ?,?); ;preparedStatement connection.prepareStatement(insertSql);preparedStatement.setString(1, userName);preparedStatement.setString(2, userPwd);int insertResult preparedStatement.executeUpdate();MayiktJdbcUtils.commitTransaction(connection);String result insertResult 0 ? 注册成功 : 注册失败;writer.println(result);} catch (Exception e) {e.printStackTrace();writer.println(error);// 回滚事务if (connection ! null)MayiktJdbcUtils.rollBackTransaction(connection);} finally {if (writer ! null) {writer.close();}MayiktJdbcUtils.closeConnection(null, preparedStatement, connection);}}
}4.编写注册html
!DOCTYPE html
html langen
headmeta charsetUTF-8title用户注册/title
/head
bodyh1用户注册/h1
form action/mayikt_web_login_war_exploded/register methodpost!--namemayiktage12 --span用户名称:/span input typetext nameuserName brspan密nbsp;nbsp;nbsp;nbsp;码:/span input typetext nameuserPwd valuebrinput typesubmit
/form
/body
/html
jdbcservlet用户登录
!DOCTYPE html
html langen
headmeta charsetUTF-8title用户登录/title
/head
bodyh1用户登录/h1
form action/mayikt_web_login_war_exploded/login methodpost!--namemayiktage12 --span名称:/span input typetext nameuserName brspan密nbsp;nbsp;nbsp;码:/span input typetext nameuserPwd valuebrinput typesubmit
/form
/body
/htmlWebServlet(/login)
public class LoginServlet extends HttpServlet {Overrideprotected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//1.获取参数String userName req.getParameter(userName);String userPwd req.getParameter(userPwd);PrintWriter writer resp.getWriter();resp.setContentType(text/html;charsetutf-8);Connection connection null;PreparedStatement preparedStatement null;ResultSet resultSet null;try {//2.验证用户名称和密码connection MayiktJdbcUtils.getConnection();String loginSql SELECT * FROM mayikt_users where userName? and userPwd? ;preparedStatement connection.prepareStatement(loginSql);preparedStatement.setString(1, userName);preparedStatement.setString(2, userPwd);resultSet preparedStatement.executeQuery();if (resultSet.next()) {String dbUserName resultSet.getString(1);writer.println(恭喜 userName 登录成功);} else {writer.println(登录失败);}} catch (Exception e) {e.printStackTrace();writer.println(error);// 回滚事务if (connection ! null)MayiktJdbcUtils.rollBackTransaction(connection);} finally {if (writer ! null) {writer.close();}MayiktJdbcUtils.closeConnection(null, preparedStatement, connection);}}
}常见问题
我们在使用tomcat 运行 web项目时 启动项目报错
java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver
原因1没有引入 mysql驱动jar包
原因2tomcat 在运行过程中 会在lib目录中查找jar包 发现没有 就会报该错误。
但是我们在编译阶段是在项目中lib 查找jar包编译阶段没有报错。
将该 jar包拷贝到 tomcat -lib 目录中即可