开发架构
C/S架构
即Client-Server(服务器-客户机)结构。C/S结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。
B/S结构
(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。这种模式统一了客户端,将系统功能实现的核心部分集中到服务器上,简化了系统的开发、维护和使用。
比较
B/S架构是从C/S架构改进而来,可以说是三层C/S架构,由此可见两者关系不一般。B/S从C/S中脱离而出,后来随着WEB技术的飞速发展以及人们对网络的依赖程度加深,B/S一举成为当今最流行的网络架构。两种架构都在各自岗位上虎虎生威,它们各有千秋,都是非常重要的网络架构。在响应速度,用户界面,数据安全等方面,C/S强于B/S,但是在业务扩展和适用www条件下,B/S明显胜过C/S。可以这么说,B/S的强项就是C/S的弱项,反之亦然。它们各有优缺点,相互无法取代。 [4]
C/S结构与B/S结构两种模式各自拥有其特色优势,在不同的系统环境与操作平台下,选择较为接近或交叉进 行混合模式的使用,可以保证数据的敏感性、安全性和稳定发展,还可以加强对数据库的修改与新增记录的操作。 对客户端程序进行保护,提高资源数据的交互性能,实现系统维护成本较低、维护方式较简便、布局更合理、网络数据使用效率较高的目的,采用C/S与B/S混合模式才是最佳方案。
WEB服务器
Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以处理浏览器等Web客户端的请求并返回相应响应,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache、 Nginx 、IIS。
Tomcat
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,最大并发访问量500,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
地址 : https://tomcat.apache.org/
解压到没有中文的路径中
注意:Tomcat的端口默认为 8080
启动
方式一 : 进入bin目录,双击startup.bat文件,启动Tomcat
如没有成功启动需要在环境变量里面的path配置jre的路径。因为Tomcat的运行是依赖本地java环境的
方式二 :通过命令行,执行启动命令startup.bat文件,开启
使用Tomcat
Eclipse :
1 关联Tomcat
导航 -> window -> preference à server
2 创建一个Tomcat服务
Servlet
Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
Servlet 执行以下主要任务:
- 读取客户端(浏览器)发送的显式的数据。这包括网页上的 HTML 表单,或者也可以是来自 applet 或自定义的 HTTP 客户端程序的表单。
- 读取客户端(浏览器)发送的隐式的 HTTP 请求数据。这包括 cookies、媒体类型和浏览器能理解的压缩格式等等。
- 处理数据并生成结果。这个过程可能需要访问数据库,执行 RMI 或 CORBA 调用,调用 Web 服务,或者直接计算得出对应的响应。
- 发送显式的数据(即文档)到客户端(浏览器)。该文档的格式可以是多种多样的,包括文本文件(HTML 或 XML)、二进制文件(GIF 图像)、Excel 等。
- 发送隐式的 HTTP 响应到客户端(浏览器)。这包括告诉浏览器或其他客户端被返回的文档类型(例如 HTML),设置 cookies 和缓存参数,以及其他类似的任务。
Servlet入门程序
一、创建javaweb工程
二、配置项目关联Tomcat
选择项目,右键 ——》Configration build path
三、 编写Servlet程序
import java.io.IOException;
// 如果Tomcat没有配置,就会导包失败
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/**
* @desc 自己的程序 需要 实现 Servlet的接口
*/
public class MyServlet1 implements Servlet{
public MyServlet1() {
System.out.println("构造方法 创建Servlet");
}
public void init(ServletConfig arg0) throws ServletException {
System.out.println("init 初始化");
}
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("service 执行");
}
public void destroy() {
System.out.println("destroy 销毁");
}
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
}
四、配置web.xml
web.xml 文件的主要目的 :
- 配置url和Servlet的映射关系
- 配置过滤器
- 配置监听器
- 配置服务器输出参数
- 等等
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>day32_servlet</display-name>
<!-- 当前项目在服务器启动,默认访问首页从以下列表中找
根据以下名字,在当前项目的根路径[WebContent]下找对应
文件,找到即展示该页面
以下6个全部都没找到,报 404
-->
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 自己编写的Servlet程序 -->
<servlet>
<!-- 给Servlet取别名 -->
<servlet-name>myS1</servlet-name>
<!-- 自己编写的Servlet的类路径 -->
<servlet-class>com.zhiyou100.servlet.MyServlet1</servlet-class>
</servlet>
<!-- 制定url请求路径 -->
<servlet-mapping>
<servlet-name>myS1</servlet-name> <!-- 与别名一致 -->
<url-pattern>/s1</url-pattern>
</servlet-mapping>
</web-app>
映射的细节
每次修改web.xml 必须重启服务.
映射路径模板
一个Servlet可以处理多个请求 OK
一个请求不能由多个Servlet处理 [Failure]
注意事项
1 默认启动项目,是使用Eclipse内部的浏览器展现页面 . 可以更改为使用外部浏览器
2 发布项目,启动项目
如果使用 点击[Tomcat V8.5xxxx] 右键 add 发布项目, 并启动Tomcat
以上方式, 会启动项目,但是需要自己手动打开浏览器,输入路径http://localhost:8080/项目名/xx 访问
3 如果是使用项目名 右键 Run as à Run on Server 运行,会自动发布项目并启动Tomcat ,且打开浏览器
4 默认启动项目,访问的是 [WebContent]下的文件, 默认按照Web.xml中指定的欢迎页列表顺序访问,找到对应名字的文件,就展示,找不到就访问404
Servlet的生命周期
1 第一次访问该Servlet时才会创建该对象
2 创建之后立即初始化,且只初始化一次
3 每次访问请求对应Servlet,都会 处理请求做出响应
4 当程序虫服务器卸载,或者是服务器直接宕机 Servlet就会销毁
技巧
1 清除Tomcat缓存
2 甚至可以删除Tomcat,重新创建Tomcat
3 清除 项目缓存,让项目重新编译
注意
目前为止, 页面资源,要放在WebContent下, 才能被访问到.
不能放在WEB-INF下.
HttpServlet
介绍
实现Servlet接口,重写了很多方法, init() destroy() getServletConfig() service()等方法,
但是Servlet主要功能 : 接收请求,做出响应. 即除了service() 有对请求处理,做出响应外,其他方法基本很少使用.
所以,为了提高开发效率, 让使用者只针对 浏览器发出的请求进行处理,做出响应
Servlet体系中有 抽象类HttpServlet类,专门用于针对 浏览器发出的请求进行处理,做出响应
继承HttpServlet
重写方法
HTTP : 超文本传输协议
协议规定了几种在网络上传输数据的方法
GET 、 POST 、DELETE、 PUT 、HEAD 、TRACE 、OPTIONS 等方法
演示 : 浏览器发出get请求,Servlet处理get请求
演示: 浏览器发出post请求, 没有对应的处理post的方法
Servlet中没有重写关于处理post请求的doPost方法,那么浏览器发出post请求时,就会报错
处理请求
浏览器发出的请求,不乱get .post等,都可以携带数据,也可以不携带数据.
一个浏览器发出的请求中有 : 请求行,请求头,请求正文
演示:获得请求中的各种数据
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @desc HttpServlet类 主要用于处理请求,做出响应
* 虽然是抽象类,但是不强制重写任何一个方法
* 而是要程序员根据实际情况,要处理什么请求,就重写什么方法
*/
public class MyServlet1 extends HttpServlet{
/**
* 重新doGet方法 用于处理浏览器发出的GET请求
* @param req : 当前Servlet一旦创建初始化,该参数中就
* 包含有所有的请求数据
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// --- 请求行 ---
String method = req.getMethod(); // 请求方法
// uri 资源标识符 : 代表请求的资源路径
String uri = req.getRequestURI(); // 获得请求路径
// url 资源定位符 : 请求的全路径
StringBuffer url = req.getRequestURL();
String protocol = req.getProtocol(); // 获得请求协议
System.out.println(method+" "+uri+" "+protocol);
System.out.println(url);
// --- 请求头 ---
// 获得所有请求头的名字
Enumeration<String> headerNames = req.getHeaderNames();
while(headerNames.hasMoreElements()) {
String headName = headerNames.nextElement();
// 根据请求头的名字获得请求头的值
String headerValue = req.getHeader(headName);
System.out.println(headName+": "+headerValue);
}
// --- 请求正文 ---
// 获得请求参数,返回的是String字符串
String id = req.getParameter("id"); // 请求中的name值,name=value
String name = req.getParameter("name");
System.out.println("id = "+id +", name = "+name);
}
}
演示 : from表单提交各种类型数据,后台接收
后台接收 ——》Servlet接收请求,从请求中获得请求数据
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* 表单中的输入框(明文,暗文,文件,日期,单选,下拉框)
* req.getParameter(name)
* 方法可以获得上述所以数据
* 方法的参数name 是,表单中input标签name属性的值
*/
String username = req.getParameter("username");
// 接收到数据全部是字符串,如果需要转为数字 , Integer.parseInt()的等方法
String password = req.getParameter("pwd");
// 文件上传,只能使用post
String file = req.getParameter("file");
// 字符串类型的日期值 : yyyy-MM-dd ==> SimpleDataFormat解析为日期对象
String birthday = req.getParameter("birthday");
String sex = req.getParameter("sex");
String address = req.getParameter("address");
System.out.println(username);
System.out.println(password);
System.out.println(file);
System.out.println(birthday);
System.out.println(sex);
System.out.println(address);
/*
* 复选框获取 getParameterValues()
* 如果复选框不选任何值,字符串数组是null
*/
String[] hobbies = req.getParameterValues("hobby");
for (int i = 0; hobbies != null && i < hobbies.length; i++) {
System.out.println(hobbies[i]);
}
}
}
路径问题
Get和Post的区别
请求方式 | GET | POST |
参数位置 | url的query中 | 一般在content中 |
参数大小 | 受限于浏览器url大小,一般不超过2K | 1G |
服务器数据接收 | 接收1次 | 根据数据大小,可分多次接收 |
适用场景(语义) | 从服务器端获取数据,不做增删改 | 向服务器提交数据,如做增删改操作 |
安全性 | 参数携带在url中,安全性低 | 相对于GET请求,安全性更高 |
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。 GET请求在URL中传送的参数是有长度限制的,而POST么有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
GET参数通过URL传递,POST放在Request body中 |
处理请求(HttpServletRequest)之跳转 —— 请求转发
跳转页面
演示 : a页面发出请求,经过Servlet,接收到请求,让页面跳转至b页面
=====
跳转Servlet
演示 : 浏览器发出/s1请求.请求到servlet1,但是servlet1将请求转到servlet2,由servlet2真正的处理请求,做出响应
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>com.zhiyou100.servlet.Servlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<!-- ===================================================== -->
<servlet>
<servlet-name>s2</servlet-name>
<servlet-class>com.zhiyou100.servlet.Servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
请求转发(forward)特点
1 请求转发是服务器行为
2 地址栏不会改变
3 一次请求
4 请求域中的数据可以在请求转发的类之间共享
HttpServletRequest 做域对象-请求域
域对象 : 理解为一片区域,里面存储的有数据.
// Servlet1类, 向域对象存储数据,并请求转发至Servlet2类
// 从Servlet2类中获得请求域中的数据
做出响应-HttpServletResponse
响应也有对应的响应消息行 响应消息头 响应消息正文
响应行/头/正文
package com.zhiyou100.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @desc 响应
*/
public class Servlet3 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收请求
// 做出响应
/*
* 设置响应状态码
* 200 ok
* 302/307 重定向
* 400
* 404 资源未找到
* 405
* 500 服务错误
* 505
*/
System.out.println("doGet执行了");
String name = req.getParameter("name");
// resp.setStatus(404);
// 设置响应内容类型及编码格式
resp.setContentType("text/html;charset=utf-8");
// 响应正文 ->使用输出流向浏览器写数据
// 得到输出流对象
PrintWriter writer = resp.getWriter();
// 向浏览器输出数据
writer.write("Hello World 你好世界");
writer.write("<html>");
writer.write("<head>");
writer.write("<title>");
writer.write("首页");
writer.write("</title>");
writer.write("</head>");
writer.write("<body bgcolor='red'>");
// 后台的数据,可以展现在前台页面
writer.write("<h1>这是首页,欢迎"+name+"</h1>");
writer.write("</body>");
writer.write("</html>");
// 使用servlet直接写html,很麻烦,不推荐
// 后续会使用jsp技术解决上述问题
}
}
重定向-跳转页面
重定向-跳转Servlet
重定向(redirect)的特点
1)重定向是浏览器行为
2)地址栏会变
3)两次请求
4)请求域中的数据可以在重定向的类之间不可以共享
在a类的请求域存储数据,从a类请求转发到b类,在b类从请求域取不出数据
Servlet API中forware()和redirect()的区别?
答:
a、浏览器显示
重定向会改变URL地址,请求转发不会改变URL地址。
b、资源共享
重定向不可以资源共享,请求转发可以。
c、功能
重定向可以用URL绝对路径访问其他Web服务器的资源,而请求转发只能在一个Web应用程序内进行资源转发,即服务器内部的一种操作。
d、效率
重定向效率低,相当于再一次请求;请求转发效率相对较高,跳转仅发生在服务器端。