基本概念
-
javaWeb是用java技术解决相关Web互联网领域的技术栈,准确的说是开发网站后端服务程序;
-
目前我们使用APP或者浏览网站应用的通信架构有两种:BS架构和CS架构;BS架构:浏览器-服务器架构,浏览器充当所有BS架构应用的客户端程序,用户操作浏览器向服务器请求数据,服务器根据请求返回响应数据。
-
静态资源是用静态网页技术(Html,CSS,JavaScript)开发的资源,所有用户访问的效果都是一样的,例如文本,图片,音频,视频和Html,CSS,JavaScript都属于静态资源;
-
动态资源,不同用户或者同一个用户访问传递的请求参数不同,服务器返回来的http响应数据经浏览器解析后展现出不一样的效果,那么用户访问的就是动态资源;浏览器访问动态资源时,服务器会先执行动态资源,再将执行的结果转化为静态资源,再发送给浏览器;
从浏览器到web服务器的“一路”
- 用户点击链接或者访问指定网址
- 浏览器通过DNS服务器获取网站主机ip,不指定端口默认端口为80端口,委托操作系统协议栈与web服务器建立tcp链接
- 浏览器依据HTTP协议发送请求数据,服务器接收并解析HTTP请求数据,
- 服务器根据请求行访问的资源路径执行对应的动态资源,查询数据库,然后依据HTTP协议将结果转为响应数据发送给浏览器。
Tomcat服务器
- Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得开发人员不必直接面向协议,简化web应用的开发;简单来说,在javaWeb中,Web服务器就是负责将浏览器发送来的请求数据封装到一个对象里(request),然后把另一个对象(Response)的封装的数据“拿”出来,按照HTTP协议组成响应数据,再发送给浏览器。
- Tomcat是目前用的比较多的轻量级web服务器,也称为Web容器、servlet容器,Servlet(动态资源)只能依据Tomcat才能被调用执行;
- Tomcat默认绑定8080端口,而Http协议默认端口是80,我们可以在Tomcat配置文件中更改Tomcat绑定的端口号;
- 我们将javaWeb项目打包成war包,然后放到Tomcat的webapps磁盘目录下即可部署完成,Tomcat启动时会加载我们部署的war包中的字节码文件,也就是动态资源到jvm方法区,供浏览器访问执行;
- 我们通过idea创建maven web项目,maven会自动将我们的项目打包成war包;
Request&Response
Request
基本概念
当浏览器将http请求数据发送到Tomcat服务器后,Tomcat解析接收到的请求数据,我们知道http请求数据包含请求行、请求头、请求体数据;Tomcat会把这些数据封装到一个Request对象中,实例化绑定目标访问路径的动态资源(比如servlet),执行动态资源对象的方法(比如service),并将该对象引用传递到方法中,程序取出该对象封装的请求数据,执行相应处理;
java提供了request的两个接口,Tomcat实现了这两个接口的实现类。
获取请求数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get......");
//获取请求行数据
req.getMethod(); // GET 获取请求方式
req.getContextPath();///hello_war 获取项目虚拟路径
req.getQueryString();// user=zs 获取get请求方式的请求参数
req.getRequestURI();///hello_war/demo2 获取资源路径
req.getRequestURL();// http://localhost/hello_war/demo2 获取资源全路径
//获取请求头数据
req.getHeader("user-ag")//根据键的名称获取请求头参数值
//获取请求体数据,post方式请求参数会放到请求体中,request提供了字节流和字符流读取请求体数据
BufferedReader br = req.getReader();
String line = br.readLine();
InputStream inputStream = req.getInputStream();
byte[] bytes = new byte[1024];
inputStream.read(bytes);
//我们可以通过设定reques对象解码字符集解决post请求方式的中文乱码问题,post请求方式,
//Tomcat直接将未解码的请求体数据原封不动放到request对象的缓冲区,因此可以设定request
//对象的解码方式,当通过流的方式或者统一方式解码获取缓冲区数据时,不会出现乱码问题
//
request.setCharacterEncoding("UTF-8");
}
- 因为get和post请求方式,请求参数的位置不同,get请求方式,请求参数在请求行中,post请求方式,请求参数在请求体中;
- Tomcat解析请求数据,根据解析到的请求方式,从请求数据中获取请求参数,将其放到request对象的不同数据结构中;我们需要根据请求方式调用不同的方法获取请求参数;
- request提供了统一的API获取请求参数;
//获取封装请求参数的集合对象
Map<String, String[]> map = req.getParameterMap();
//根据键值获取请求参数值数组
String[] hobbies = req.getParameterValues("hobby");
//如果我们知道当前请求参数就一个值,可以用该方法
String userName = req.getParameter("username");
请求转发
请求转发,一种在服务器内部的资源跳转方式;
- 浏览器发送请求数据给服务器,服务器中对应的动态资源A接收到请求;
- 资源A处理完后将请求转发给资源B;
- 资源B处理完委托Tomcat将结果响应给浏览器;
- 请求从资源A到资源B的过程叫请求转发;
Tomcat通过request对象进行请求转发;多个动态资源可以共享request对象封装的数据,包括封装的请求数据和前一个动态资源封装进的数据;
//请求转发,将当前request和response对象传递到下一个动态资源继续处理
req.getRequestDispatcher("资源B绑定路径").forward(req,resp);
req.getRequestDispatcher("/demo2").forward(req,resp);