Hello Web
Web
World Wide Web 全球广域网->也称为万维网 是一种基于超文本和HTTP协议的分布式应用架构
HTML(HyperText Mark-up Language):用于链接网络上的信息
HTTP协议(HyperText Transfer Protocol):规定了服务端与客户端通信的规则
万维网:WWW是World Wide Web的简称
C/S: Client/Server 客户端与服务端交互的应用程序
B/S: Browser/Server 浏览器与服务器交互的web应用程序–>网站
c/s与b/s区别:
C/S需要客户拥有特定的客户端,比如你的app,你在app中的每次操作会被当作请求发送至服务器进行处理,服务器再做出对应的响应给你。
优点:响应速度快(客户端与服务端直接进行交互)、安全性高
缺点:宕机 、升级更新、运行工作全部由服务器完成、服务器运行压力较大
B/S只需要客户拥有浏览器即可访问,永远保持最新状态,避免了停机更新的时段。
优点: 客户无需升级,只需更新服务器即可。可以通过一定权限实现多客户访问,交互性较强
缺点:访问速度较慢、安全性没有C/S高
动态Web与静态Web
静态Web:所有的用户访问到的网页界面相同,如html、css、JavaScript
动态Web:不同客户访问同一网页得到的界面各不相同 如:servlet/JSP、PHP
Maven和TomCat
Tomcat
TomCat是阿帕奇Apache基金组织发行的开源、免费的服务器软件,属于中小型Java EE 服务器
安装与配置遍布全网 安装网址: http://tomcat.apache.org/
Maven
简单来讲:Maven用于在web开发中导入jar包使用,省去了导入大量jar包的步骤
官网:https://maven.apache.org/
一些依赖和配置:
阿里云镜像:
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
servlet依赖&jsp依赖
javax.servlet-api
<!-- servlet依赖如下 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<!-- ----------------------------------- -->
jsp-api
<!-- jsp依赖如下 -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<!-- mysql驱动配置 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.31</version>
</dependency>
Hello Servlet
Servlet:sun公司提供的一门开发动态Web的技术
- Java提供了一个接口Servlet用于开发,我们通常把实现了Servlet接口的类称之为一个servlet
- 开发web需要我们编写一个servlet实现类、将开发好的Java类部署到web服务器中
此处提到一个artifacts(可以理解为一个工件、构件) 我们开发完成的Java项目需要部署在服务器上,artifacts的作用就是将Java项目打成一个文件包(常见如war包、exploded包)
在IDEA中: 选中你的项目模块—>open Module Settings–>
可以看到我们每个web项目模块都会生成这样的artifacts部署文件包,下面我们看TomCat的操作:我们需要再tomCat上选择要运行的web项目文件包才能再服务器上部署:同一时刻不建议将多个文件包选中(可能会造成包之间的冲突导致报错):
ServletContext
用法一:共享数据
可以用于多个servlet之间通信(不通过数据持久化就可以实现)
// -- 设定servlet
this.getServletContext().setAttribute("键key","值value")
// -- 获取servlet
String value = this.getServletContext().getAttribute("键key")
用法二:获取初始化参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 获取servletContext容器 2. 根据初始化参数名获取该参数
String url = req.getServletContext().getInitParameter("url");
// 3. 写出
resp.getWriter().println("url:"+url);
}
<!-- 配置一些web程序初始化参数 -->
<context-param>
<param-name>url</param-name>
<param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
</context-param>
<!-- 注册servlet -->
<servlet>
<servlet-name>demo01</servlet-name>
<servlet-class>gec.ServletDemo01</servlet-class>
</servlet>
<!-- 映射servlet路径 -->
<servlet-mapping>
<servlet-name>demo01</servlet-name>
<url-pattern>/demo01</url-pattern>
</servlet-mapping>
用法三:请求转发
// --请求转发
// --1. 获取请求转发器,并规定好转发的目标位置 /demo01 斜杠代表当前项目 demo01 表示某一个映射后的地址
// RequestDispatcher requestDispatcher = req.getRequestDispatcher("/demo01");
// --2. 调用forward方法转发 入参req、resp
// requestDispatcher.forward(req,resp);
// --3. 简化写法
req.getRequestDispatcher("/demo01").forward(req,resp);
用法四:读取资源文件
在resources资源包下创建了资源文件( ##.properties文件 )可以通过servletContext+Properties进行读取,如下:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 通过properties获取文件资源内容
// --1. 获取流
InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
// --2. 创建properties对象
Properties prop = new Properties();
// --3. 将流注入属性对象
prop.load(is);
// --4. 以键值对形式获取指定路径下资源的内容
String username = prop.getProperty("username");
String password = prop.getProperty("password");
resp.getWriter().println("username="+username+"\npassword="+password);
}
注意上述程序中的–> /WEB-INF/classes/db.properties
HTTPServletResponse–>resp
HTTPServletResponse: 服务器将要给客户端做出的响应
HTTPServletRequest: 服务器接收的客户端的请求
resp方法:
// 向浏览器发送数据
servletOutputstream getOutputstream() throws IOException;
Printwriter getwriter() throws IOException;
//向浏览器发送响应头
// 设置编码方式
void setCharacterEncoding(String var1);
// 设置文本长度
void setContentLength(int var1);
void setContentLengthLong(long var1);
// 设置文本文件类型 通常为--> text/hrml
void setContentType(String var1);
void setDateHeader(String varl,long var2)
void addDateHeader(String var1,long var2)
// 设定头信息 通常 var1代表请求 var2代表操作
void setHeader(String var1,String var2);
void addHeader(String var1,String var2);
void setIntHeader(String var1,int var2);
void addIntHeader(String varl,int var2);
下载文件操作
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// -- 下载文件
// --1. 定义要下载的文件路径
String realPath = "C:\\Users\\20729\\Desktop\\杂七杂八\\photo\\1.jpg";
System.out.println("下载路径:"+realPath);
// --2. 下载的文件名
String fileName = realPath.substring(realPath.lastIndexOf("\\"+1));
// --3. 设置下载头信息(客户端真正执行下载操作的核心),另浏览器能够支持(Content-Disposition)所下载文件
resp.setHeader("Content-disposition","attachment;filename"+fileName);
// --4. 获取下载文件的输入流
FileInputStream fis = new FileInputStream(realPath);
// --5. 创建缓冲区
int len = 0;
byte[] buffer = new byte[1024];
// --6. 通过响应对象获取输出流
ServletOutputStream os = resp.getOutputStream();
// --7. 写出文件
while((len=fis.read(buffer))>0){
os.write(buffer,0,len);
}
// --8. 关闭流
fis.close();
os.close();
}
重定向
// 依旧以登录校验为例
if (username.equals("admin")&&password.equals("123456")){
// 重定向
/*
resp.sendRedirect("/mvnWeb-02/login.html")实际上是完成了以下两个步骤(按照下面的写法也可以完成重定向):
--1. resp.setHeader("Location","/mvnWeb-01/login.html");
--2. resp.setStatus(302);
302就是指重定向的状态代码,一般开发会用:
resp.setStatus(HttpServletResponse.SC_MOVED_TEMPORARILY);
*/
resp.sendRedirect("/mvnWeb-02/login.html");
}else{
resp.sendRedirect("/mvnWeb-02/index.html");
}
重定向与请求转发
- 两者都可以实现页面跳转
- 请求转发时,url地址栏不会发生变化
- 重定向时,url地址栏会发生变化
请求转发如图:
A想要请求获取C的资源但是不能直接获取,则A只能向B发送请求,B再请求C,最终返回
重定向如图:
A想要获取C的资源,A本来是向B发送请求,但是A可以直接跳转定向C发送请求
HTTPServletRequest
请求转发
用户登录校验
doGet:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
// 登录校验
if (username.equals("admin")&&password.equals("123456")){
// 请求转发
req.getRequestDispatcher("/login.html").forward(req,resp);
}else {
req.getRequestDispatcher("/index.html").forward(req,resp);
}
}
index.html
<form action="/mvnWeb-02/login">
// 此处action指定的login为servlet映射的地址叫做 login --> 需要在web.xml配置
账号:<input type="text" name="username" placeholder="输入账号"><br>
密码:<input type="password" name="password" placeholder="输入密码"><br>
<button type="submit" value="登录">登录</button>
</form>
login.html
<h1>WELCOME TO MY WORLD!</h1>
web.xml
<!-- 注册Demo06 -->
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>gec.HttpServletRequestDemo07</servlet-class>
</servlet>
<!-- 映射servlet路径Demo05 -->
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>