前言
需要了解的技术:
- 了解web的概念,前后端交互工程;
- 数据库:前后端交互,后端在处理完数据后会把数据存辉到数据库;
- SQL语句
- java语言的数据库规范的jdbc;如何连接数据库,如何获取数据
- 浏览器端和服务端交互的规范的servlet:围绕着亲求和响应来制定规范;
- 在浏览器端渲染的数据的模块引擎jsp;
- 前端的一些基础:Html(网页的组成、css(网页的样式、)
- 前端的一门编程语言javascript(js)
- 封装了js的框架 jquery
一、服务器概述
1.1 web资源分类
- web资源的实现的技术和呈现的效果不同,又分为静态资源和动态资源两种。
- 静态资源:html ,css ,js ,txt ,mp4 ,jpg。
- 动态资源:jsp页面,servelt程序。
1.2 认识服务器
服务器本质的作用是部署项目;
①tomcat(Apache 免费开源、轻量级的javaWeb容器(服务器),效率不高应用广泛,在高并发的大数据处理中可以搭建服务器集群)
②jboss免费,遵从javaEE,花钱买服务维护
③glassfish收费,达到产品级质量(快、好用)
1. 3 学习中适用到的服务器
本次学习中我们把web项目部署在浏览器端应用,而每种服务器的性能不同。我们在这里使用的服务器是tomcat
二、tomcat的安装以及相关操作
2.1 安装tomcat
- 解压到文件夹就可以使用;
- 配置环境变量:JAVA_HOME +绝对路径;
2.2 启动tomcat
- 点击/bin/statup.bat文件,启动tomcat;或者在cmd内输入catalina.run
- 文件映射到webapps中,新建html文件就可以使用;
- 查询网站:默认访问root工程。
访问格式:http://ip:port/工程名/ 没有资源名默认访问index.html
页面。
2.3 在idea中整合tomcat
- 再idea中新建tomcat工程

- tomcat与idea集成:新建工程、右击工程名,添加web项目;
- 部署:点击右上的选项,点击修改sever:命名、路径、取消默认浏览器、端口;
- 点击部署deployed,添加一个,再改一下网址。
三、javaweb
3.1 servelet
- 定义:一个处理和响应对象的规范;是一个表现层的规范,(jdbc是一个持久层的规范)。常用的版本7版本或者8版本。 jdbc、 servlet是规范而不是技术。
- JavaEE规范之一;
- 是运行在服务器上的一个java小程序。他可以接受客户端发来的请求并响应数据给客户端。

两个搭配起来使用,通过servlet来指定后端资源唯一标识,通过servlet-mappoing来指定资源路径。注意必须带/的位置,不带会报错。
或者使用标签的形式来替代上面的方法。@WebServlet(“/标签名”)
3.2 在工程内的写法
① 继承HttpServlet类,重写srevice方法
protected void service(HttpServletRequest Request, HttpServletResponse Response){
②request请求对象 请求客户端传过来的数据;response响应对象,处理完后端逻辑之后可以根据需求。
将web工程打包成一个war包,部署在tomcat上,如果想访问这个工程我们需要提供工程路径;
工程、很多资源;
如果想访问一个该工程下面具体的资源,一定要针对这些资源做一个资源设置一个资源路径;
http://loaclhost:软件所对应的端口号。
5.3 servlet生命周期
- 执行构造器(重写service方法)创建servlet实例
- 执行初始化方法;
- 执行service方法;
- 客户端发起发起访问,tomcat服务器会解析地址中的资源路径,然后在web . xm1中映射具体的后端资源;
- 映射到后端资源之后,tomcat服务器会创建对应资源的实例;
- 实例创建出来之后,就会去调用初始化init方法(可以去获取上下文的数据、全局对象等);
- 执行service方法(后面在子类实现中,会通过提交的方式,来做一个请求的分发处理);
- 当tomcat 容器关闭的时候,会执行销毁的方法。 ```java package com.eaglslab.servlet;
import javax.servlet.*; import java.io.IOException;
public class HelloServlet02 implements Servlet {
public HelloServlet02() {System.out.println("1、执行构造器,创建servlet实例");}@Overridepublic void init(ServletConfig servletConfig) throws ServletException {System.out.println("2、执行了初始化方法");}@Overridepublic ServletConfig getServletConfig() {return null;}@Overridepublic void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {System.out.println("3、执行service方法");}@Overridepublic String getServletInfo() {return null;}@Overridepublic void destroy() {System.out.println("4、执行销毁的方法");}
}
<a name="dMZRv"></a>##### 5.4 servlet提交方式1. 关于post捉交为式和get提交方式的区别- post提交方式相对来说比较较安全,因为通过post方式往后端抉交数据,是将数据封牧在一起请求体中-get抉交方式不是很安全,提交的数据直越拼拉在地址:上面- get的提交的数据大小没有post多- 我们目前在学习web阶段能够接触到的post和get提交方式- get:浏览器直接发起访问、在html的form表单中将method提交方式设置为get-post:在htm1的form表单中将method提交方式设置为post2. **注解**: servlet基于注解方式来注朋资源路径(不若使用,为我们还没有学习注解)@WebServlet("/s1")servlet容器会根据检测到的注解来创建对应的资源路径;浏览器也会更具注解来创建对应资源的实例。3. ServletContext 域对象- 可以像map集合一样存取数据,‘域’的概念是取值范围的大小。- ServletContext 是一个全局域对象,只要在该对象中设置了数据,我们可以在整个工程范围内获取到该对象中的值- request也是一个域对象,取值范围是一次请求范围内;- session也是一个域对象,取值范围是浏览器的开启到关闭。- 无论创建多少servletContext对象,他们的内存地址都是相同的,-->wevletContext在整个web工程中是单例的。(单例工程,无论创建多少个对象,都是指向同一个内存地址。)<br /><br /><br />将数据封装到域对象内在提交给前端。<a name="P0xQL"></a>### 六、HTTP协议<a name="cHf59"></a>##### 6.1 GET请求1. 请求行- 请求的方式GET- 请求的资源路径[+?+请求参数](3)请求的协议的版本号HTTP/1.12、请求头2. key : value 组成不同的键值对,表示不同的含义2. 安全性:不安全,数据拼接在请求后;<a name="qLqLp"></a>##### 6.2 POST请求1. 请求行- 请求的方式POST- 请求的资源路径[+?+请求参数]- 请求的协议的版本号HTTP/1.12. 请求头key : value 不同的请求头,有不同的含义- 3、请求体===>>>就是发送给服务器的数据2. 安全性:安全,请求数据封装在请求体内部。4. 常用请求头的说明- Acccpt:表示客户端可以接收的数据类型- Accpet-Languege:表示客户端可以接收的语言类型- User-Agent:表示客户端浏览器的信息- Host :表示请求时的服务器ip和端口号<a name="QW9SE"></a>##### 6.3 响应的HTTP协议格式z<br />- 1、响应行<br />·(1)响应的协议和版本号·(2)响应状态码<br />(3)响应状态描述符<br />-2、响应头key : value 不同的请求头,有不同的含义- 3、响应体===>>>就是回传给客户端的数据<a name="YtARD"></a>##### 6.4 常用的响应码说明- 200表示请求成功- 302表示请求重定向- 404表示请求服务器已经收到了,但是你要的数据不存在(请求地址错误)- 500表示服务器已经收到请求,但是服务器内部错误(代码错误)<a name="a2zPu"></a>##### 6.5 HttpServletRequest类- 将每次只要有请求进入Tomcat服务器,Tomcat服务器就会把请求过来的HTTP协议信息解析好封装到Request对象中。然后传递到service方法(doGet 和doPost)中给我们使用。- 我们可以通过HttpScrvletRcquest对象,获取到所有请求的信息。<a name="REjns"></a>##### 6.6 HttpServletRequest 类的常用方法1. getRequcstURI(获取请求的资源路径)1. getRequestURL()获取请求的统一资源定位符(绝对路径1. getRemoteHostO 获取客户端的 ip地址iv.getHeader(获取请求头.1. getParameter()获取请求的参数1. getParameterValues()获取请求的参数(多个值的时候使用) vii.1. getMethod(获取请求的方式GET 或POST)返回客户端的提交方式。String类型。7. setAltribule(key,value);设置域数据7. getAttribute(key);获取域数据7. getRequestDispatcher(获取请求转发对象<a name="rZ8qS"></a>##### 6.7 请求转发转发其实就是资源的跳转,但是跳转之后的地址在浏览器上不会发生变化```java@WebServlet("/s6")public class Servlet06 extends HttpServlet {/*** 转发其实就是资源的跳转,但是跳转之后的地址在浏览器上不会发生变化* @param request* @param response* @throws ServletException* @throws IOException*/@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//往request域中添加数据request.setAttribute("message","request也是一个域对象");//获取转发对象RequestDispatcher requestDispatcher = request.getRequestDispatcher("/s7");//请求具体的资源requestDispatcher.forward(request,response);
@WebServlet("/s7")public class Servlet07 extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {Object message = request.getAttribute("message");System.out.println(message);response.getWriter().print("s6 ==> s7 success!!!!");}}
6.8 HttpServletResponse类
HttpServletResponse类和HttpServletRequest类一样。每次请求进来,Tomcat服务器都会创建一个esponse对象传递给Servlet程序去使用。HttpServletRequest表示请求过来的信息,
HttpServletResponse表示所有响应的信息,我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置
6.9 往客户端回传数据
流对象由tomcat服务器提供。
字节流getOutputStream()
常用于下载(传递二进制数据) 传输文本;
字符流getWriter()
常用于回传字符串(常用)
字符流和字节流一次只可以使用一种,同时向tomcat服务器请求会报错。
- 响应的乱码解决
setContentType(“text/html; charset=UTF-8”)
resp.setContentType("text/html; charset=UTF-8");PrintWriter writer = resp.getWriter();writer.print("hello");writer.print("<br/>");writer.print("你好");
6.10 请求重定向
- 作用:完成资源的跳转;
- 与请求转发的区别:请求转发地址不变化,请求重定向地址会发生变化。
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端去新地址访问。叫请求重定向(因为之前的地址可能已经被废弃)
相对于请求转发,重定向需要的是资源的绝对路径。
- 想要把数值传递通过request域,注意地址发生变化后,在访问域中数据就是两次请求,域的取值范围就是一次请求。

七、web前后端交互案例
html简单应用。
案例
通过jdbc工具类在数据库中读取用户数据,将所有用户数据封装成java对象,添加到集合中,然后将集合对象存放到request域中,然后利用转发从s11跳转到s12,然后在s12中将集合对象响应到浏览器端
<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>用户登录界面</title><style>body{background-color: #0040ff;}</style></head><body><form method="post" action = "http://localhost:8080/web/login"><table align = "center"><tr><td> 登陆用户名:</td><td><input type="text" na me="username"></td></tr><tr><td> 登陆密码:</td><td><input type="password" name="password"></td></tr><tr><td colspan="2" align="center"><input type="submit" value="login"></td></tr></table></form></body></html>
import java.sql.*;//jdbc的封装操作;public class JDBCUtils {private JDBCUtils(){}static {try {Class.forName("com.mysql.cj.jdbc.Driver");} catch (ClassNotFoundException e) {e.printStackTrace();}}public static Connection getconnection() throws SQLException {return DriverManager.getConnection("jdbc:mysql://localhost:3306/test1?characterEncoding=utf8&serverTimezone=GMT%2B8","root","root");}public static void close(Connection connection , Statement statement , ResultSet resultSet ){if(resultSet != null){try {resultSet.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (statement != null){try {statement.close();} catch (SQLException throwables) {throwables.printStackTrace();}}if (connection != null){try {connection.close();} catch (SQLException throwables) {throwables.printStackTrace();}}}}
import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class LoginServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");String username = request.getParameter("username");String password = request.getParameter("password");Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;try {connection = JDBCUtils.getconnection();System.out.println(connection);preparedStatement = connection.prepareStatement("select * from user where username = ? and password = ?");preparedStatement.setString(1,username);preparedStatement.setString(2,password);resultSet = preparedStatement.executeQuery();if (resultSet.next()){response.getWriter().print("登录成功");}else {response.getWriter().print("登录失败");}} catch (SQLException throwables) {throwables.printStackTrace();}finally {//关闭资源JDBCUtils.close(connection,preparedStatement,resultSet);}}}

