JavaWeb内容
一、Servlet简介⭐
Servlet 就是 Sun 公司开发动态 Web 的一门技术
Sun 在这些 API (Application Programming Interface,应用程序接口)中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:
- 编写一个类,实现Servlet接口。
- 把开发好的Java类部署到web服务器中。
把实现了 Servlet 接口的 Java 程序叫做,Servlet
1.HelloServlet
Serlvet 接口 Sun 公司有两个默认的实现类:HttpServlet,GenericServlet
- Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。
- Servlet 是运行在服务器上的一个 java 小程序(接口),它可以接收客户端发送过来的请求,并响应数据给客户端。
1-1.编写一个Servlet程序
S1:编写一个普通类
S2:实现 Servlet 接口,这里我们直接继承 HttpServlet
public class HelloServlet extends HttpServlet {
//由于get或者post只是请求实现的不同的方式,可以相互调用,业务逻辑都一样;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//ServletOutputStream outputStream = resp.getOutputStream();
PrintWriter writer = resp.getWriter(); //响应流
writer.print("Hello,Serlvet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
1-2.编写 Servlet 的XML映射与配置规则
@WebServlet(name = "Servlet", value = "/Servlet")
public class Servlet extends HttpServlet {
}
* 表示输入什么数字都行
第四点不要配置,一般项目只用其中一种配置方法
为什么需要映射:我们写的是 Java 程序,但是要通过浏览器访问,而浏览器需要连接 Web 服务器,所以我们需要再 Web 服务中注册我们写的 Servlet,还需给他一个浏览器能够访问的路径;
<!--注册Servlet-->
<servlet>
<!--servlet-name 标签 Servlet 程序起一个别名(一般是类名) -->
<servlet-name>hello</servlet-name>
<!--servlet-class 是 Servlet 程序的全类名-->
<servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
</servlet>
<!--servlet-mapping 标签给 servlet 程序配置访问地址-->
<servlet-mapping>
<!--servlet-name 标签的作用是告诉服务器,我当前配置的地址给哪个 Servlet 程序使用-->
<servlet-name>hello</servlet-name>
<!--
url-pattern 标签配置访问地址
/ 斜杠在服务器解析的时候,表示地址为:http://ip:port/工程路径
/hello 表示地址为:http://ip:port/工程路径/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
1-3 Servlet 原理
Servlet 是由 Web 服务器调用,Web 服务器在收到浏览器请求之后,会:
1-4.Servlet生命周期🧡
-
执行 Servlet 构造器方法
-
执行 init() 初始化方法
1,2,是在客户端第一次访问的时候创建 Servlet 程序会调用
-
执行 service() 方法
每次访问都会调用。
-
执行 destroy() 销毁方法
在 web 工程停止的时候调用。
-
servlet在容器中是单例的,线程不安全的
1-5.Request
获得请求
String method=this.getMethod();
//判断
if("GET".equals(method)){
//Get方式获取请求参数
params=this.getQueryString();
}else id("POST".equals(method)){
//POST方式获取请求参数
BufferedReader reader =this.getReader();
params=reader.readLine();
}
//通用方法
Map<String,String[]> getParameterMap():获取所有参数的Map集合
String[] getParameterValues(String name):根据名称获取参数值
💗String getParameter(String name):根据名称获取参数值(单个值)
解决中文乱码
请求转发🧡
1-6.Response
设置响应数据
重定向🧡
解决中文乱码(常用)🧡
response.setContentType("text/html;charset=utf-8");
1-7.ServletContext
定义
- ServletContext 是一个接口,它表示 Servlet 上下文对象
- 一个 web 工程,只有一个 ServletContext 对象实例。
- ServletContext 对象是一个域对象。(是可以像 Map 一样存取数据的对象,叫域对象。)
- ServletContext 是在 web 工程部署启动的时候创建。在 web 工程停止的时候销毁
作用🧡
-
读取资源文件
Properties
- 在 java 目录下新建 properties
- 在 resources 目录下新建 properties
发现:都被打包到了同一个路径下:classes,我们俗称这个路径为classpath:
思路:需要一个文件流;
public class ServletDemo05 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取资源路径的io流 InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties"); Properties prop = new Properties(); prop.load(is); String user = prop.getProperty("username"); String pwd = prop.getProperty("password"); resp.getWriter().print(user+":"+pwd); } }
-
获取当前的工程路径,格式: /工程路径
// 2、获取当前的工程路径,格式: /工程路径 System.out.println( "当前工程路径:" + context.getContextPath() );
-
获取工程部署后在服务器硬盘上的绝对路径
// 3、获取工程部署后在服务器硬盘上的绝对路径 /* 斜杠被服务器解析地址为:http://ip:port/工程名/ 映射到 IDEA 代码的 web 目录 */ System.out.println("工程部署的路径是:" + context.getRealPath("/")); System.out.println("工程下 css 目录的绝对路径是:" + context.getRealPath("/css")); System.out.println("工程下 imgs 目录 1.jpg 的绝对路径是:" +context.getRealPath("/imgs/1.jpg"));
-
共享数据
在一个 servlet 中保存的数据,可以在另一个 servlet 中拿到;
public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //创建ServletContext对象 ServletContext context = this.getServletContext(); String username = "秦疆"; //数据 //将一个数据保存在了ServletContext中,名字为:username 。值 username context.setAttribute("username",username); }
public class GetServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext context = this.getServletContext(); //获取之前Servlet程序中设置的username的值 String username = (String) context.getAttribute("username"); resp.getWriter().print("名字"+username); } }
二、JSP
1.jsp脚本
JSP 本质上就是⼀个 Servlet,JSP 主要负责与⽤户交互,将最终的界⾯呈现给⽤户, HTML+JS+CSS+Java 的混合⽂件。
当服务器接收到⼀个后缀是 jsp 的请求时,将该请求交给 JSP 引擎去处理,每⼀个 JSP ⻚⾯第⼀次被访 问的时候,JSP 引擎会将它翻译成⼀个 Servlet ⽂件,再由 Web 容器调⽤ Servlet 完成响应。
单纯从开发的⻆度看,JSP 就是在 HTML 中嵌⼊ Java 程序。
具体的嵌⼊⽅式有 3 种:
1-1、JSP 脚本,执⾏ Java 逻辑代码
<% Java代码 %>
1-2、JSP 声明:定义 Java ⽅法
<%! 声明 Java ⽅法 %>
1-3、JSP 表达式:把 Java 对象直接输出到 HTML ⻚⾯中
<%=Java变量 %>
<%! public String test(){ return "HelloWorld"; } %>
<% String str = test(); %>
<%=str%>
1-4.JSP已经逐步退出了程序圈
2.EL表达式
page域与application域都不常用
3.JSTL标签
3-1.入门
3-2.<c:forEach>
4.MVC模式
三、会话⭐
**会话:**就是客户端和服务器之间发⽣的⼀系列连续的请求和响应的过程,打开浏览器进⾏操作到关闭浏
览器的过程。
**会话状态:**指服务器和浏览器在会话过程中产⽣的状态信息,借助于会话状态,服务器能够把属于同⼀
次会话的⼀系列请求和响应关联起来
属于同⼀次会话的请求都有⼀个相同的标识符,sessionID
1.Cookie
1-1.Cookie的基本使用
Cookie 是服务端在 HTTP 响应中附带传给浏览器的⼀个⼩⽂本⽂件,⼀旦浏览器保存了某个 Cookie,
在之后的请求和响应过程中,会将此 Cookie 来回传递,这样就可以通过 Cookie 这个载体完成客户端
和服务端的数据交互。
在浏览器第一个访问的时候将Cookie头设置为一个CookieID并返回,下次访问的时候直接将这次的CookieID一起传输过去
1-2.Cookie的使用原理
Cookie是基于HTTP协议实现的
- 响应头:set-Cookie
- 请求头:cookie
1-3.Cookie的使用细节
2.Session
属于同⼀次会话的请求都有⼀个相同的标识符,sessionID。
在服务器设置一个SessionID便于使用
2-1.Session的基本使用
2-2.Session的使用原理
Session是基于Cookie实现的,将cookie的头设置为Session的ID传输给浏览器
当浏览器关闭,再开启时,SeesionID的值会发生改变
2-3.Session的使用细节
3.Session与Cookie的区别
四、Filter
1.Filter定义
2.Filter快速入门
3.Filter执行流程
4.Filter使用细节
4-1.拦截路径
4-2.过滤器链
同时配置多个 Filter,Filter 的调⽤顺序是由 web.xml 中的配置顺序来决定的,写在上⾯的配置先调
⽤,因为 web.xml 是从上到下顺序读取的。
5.常用的地方
5-1.统⼀处理中⽂乱码。
5-2.屏蔽敏感词。
@WebFilter("/test")//所拦截的类路径
public class WordFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
servletRequest.setCharacterEncoding("UTF-8");
//将"敏感词"替换成"***"
String name = servletRequest.getParameter("name");
name = name.replaceAll("敏感词","***");
//将值传递回去
servletRequest.setAttribute("name",name);
//放行
filterChain.doFilter(servletRequest,servletResponse);
}
}
@WebServlet("/test")
public class TestServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//获取filter传递的值
String name = (String) req.getAttribute("name");
System.out.println("servlet:"+name);
}
}
5-3.控制资源的访问权限。
@WebFilter("/download.jsp")
public class DownloadFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse
servletResponse, FilterChain filterChain) throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpSession session = request.getSession();
String name = (String) session.getAttribute("name");
if(name == null){
//不是登录状态
response.sendRedirect("/login.jsp");
}else{
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
5-4.上传和下载
JSP
1、input 的 type 设置为 fifile
2、form 表单的 method 设置 post,get 请求会将⽂件名传给服务端,⽽不是⽂件本身
3、form 表单的 enctype 设置 multipart/form-data,以⼆进制的形式传输数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form enctype="multipart/form-data" action="/upload" method="post">
<input name="desc" type="text"/><br/>
<input name="text" type="file"/><br/>
<input type="submit" value="上传"/>
</form>
</body>
</html>
Servlet
fifileupload 组件可以将所有的请求信息都解析成 FileIteam 对象,可以通过对 FileItem 对象的操作完成
上传,⾯向对象的思想。
package com.southwind.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.List;
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException { }
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// //通过输⼊流获取客户端传来的数据流
// InputStream inputStream = req.getInputStream();
// Reader reader = new InputStreamReader(inputStream);
// BufferedReader bufferedReader = new BufferedReader(reader);
// //通过输出流将数据流输出到本地硬盘
// //获取⽂件夹的绝对路径
// String path = req.getServletContext().getRealPath("file/copy.txt");
// OutputStream outputStream = new FileOutputStream(path);
// Writer writer = new OutputStreamWriter(outputStream);
// BufferedWriter bufferedWriter = new BufferedWriter(writer);
// String str = "";
// while((str = bufferedReader.readLine())!=null){
// System.out.println(str);
// bufferedWriter.write(str);
// }
// bufferedWriter.close();
// writer.close();
// outputStream.close();
// bufferedReader.close();
// reader.close();
// inputStream.close();
try {
DiskFileItemFactory fileItemFactory = new DiskFileItemFactory();
ServletFileUpload servletFileUpload = new ServletFileUpload(fileItemFactory);
List<FileItem> list = servletFileUpload.parseRequest(req);
for(FileItem fileItem : list){
if(fileItem.isFormField()){
String name = fileItem.getFieldName();
String value = fileItem.getString("UTF-8");
System.out.println(name+":"+value);
}else{
String fileName = fileItem.getName();
long size = fileItem.getSize();
System.out.println(fileName+":"+size+"Byte");
InputStream inputStream = fileItem.getInputStream();
// Reader reader = new InputStreamReader(inputStream);
// BufferedReader bufferedReader = new
BufferedReader(reader);
String path =
req.getServletContext().getRealPath("file/"+fileName);
OutputStream outputStream = new FileOutputStream(path);
// Writer writer = new OutputStreamWriter(outputStream);// BufferedWriter bufferedWriter = new
BufferedWriter(writer);
int temp = 0;
while((temp = inputStream.read())!=-1){
outputStream.write(temp);
}
// bufferedWriter.close();
// writer.close();
outputStream.close();
// bufferedReader.close();
// reader.close();
inputStream.close();
System.out.println("上传成功");
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
}
}
下载
package com.southwind.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@WebServlet("/download")
public class DownloadServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String type = req.getParameter("type");
String fileName = "";
switch (type){
case "png":
fileName = "1.png";
break;
case "txt":
fileName = "test.txt";
break;
}
//设置响应⽅式
resp.setContentType("application/x-msdownload");
//设置下载之后的⽂件名
resp.setHeader("Content-Disposition","attachment;filename="+fileName);
//获取输出流
OutputStream outputStream = resp.getOutputStream();
String path = req.getServletContext().getRealPath("file/"+fileName);
InputStream inputStream = new FileInputStream(path);
int temp = 0;
while((temp=inputStream.read())!=-1){
outputStream.write(temp);
}
inputStream.close();
outputStream.close();
}
}
五、Listener(用得不多)
1.Listener概念
2.Listener基本
使用
六、AJAX⭐
1.AJAX概念
异步:客户端在等待服务器时,可以进行其他动作
2.AJAX快速入门
- 2,3,4的代码在www.w3cschool.com里面找
- 3中url中填全路径(http:localhost…)
七、JSON⭐
1.基本概念
2.基本语法
3.JSON与java数据的转换
八、JDBC
1.JDBC的简介
2.JDBC快速入门
3.JDBC的API详解
3-1.DriverManager(驱动管理类)
作用:
-
注册驱动
Class.forName("驱动名");//java5之后可以省略不写
-
获取数据库连接
Connection conn=DriverManager.getConnection(url,userName,password); /*url(连接路径) 语法:jdbc:mysql//ip地址(域名):端口号/数据库名称?参数键值对1&参数键值对2 示例:jdbc:mysql://127.0.0.1:3306/db1 细节: 1.如果连接的是本机的Mysql服务器默认端口号是3306,则url可以简写为:jdbc:mysql://数据库名称?参数键值对 2.配置useSSL=false参数,禁用安全连接方式,解决警告提示 jdbc:mysql://db1?useSSL=false 3.高版本要写时区 serverTimezone=GMT%2B8 */
3-2.Connection(数据库连接对象)
-
获取执行SQL的对象
- 普通执行SQl对象
Statement createStatement()
- 预编译SQL的执行SQL对象:防止SQL注入
PreparedStatement prepareStatement(sql)
- 执行存储过程的对象
CallableStatement prepareCall(sql)
- 管理事物
- **开启事务:**setAutoCommit(boolean x): true为自动提交事务,false为手动提交事务,即为开启事务
- **提交事务:**commit()
- **回滚事务:**rollback()
3-3.Statement
-
执行SQL语句
- executeUpdate(sql):执行添加/删除/修改语句返回受影响的行数(int)
- executeQuery(sql):执行查询语句,返回查询结果一个虚拟表(ResultSet)
while(rs.next()){ int id=rs.getInt("id"); String name=rs.getString("name"); }
3-4.PreparedStatement
String sql="select *from user where name=? and id=?";
//定义PreparedStatement对象
PreparedStatement pstmt=conn.prepareStatement(sql);
//设置?的值
pstmt.setString(1,name);
pstmt.setInt(2,id);
//执行sql
ResultSet rs=pstmt.executeQuery();
4.数据库连接池
4-1.简介
4-2.实现
4-3.操作
九、Http⭐
1.什么是 HTTP?
HTTP(hypertext transport protocol) 超文本传输协议
。
- 文本 :HTML,字符串…
- 超文本:图片,音乐,视频,定位,地图…
- 80 端口
HTTPS(Hyper Text Transfer Protocol over SecureSocket Layer):是以安全为目标的 HTTP 通道,在 HTTP 的基础上通过传输加密和身份认证保证了传输过程的安全性。HTTPS 在HTTP 的基础下加入SSL 层,HTTPS 的安全基础是 SSL。
- 443 端口
2. 两个时代
HTTP 1.0:
- HTTP/1.0:客户端与 Web 服务器连接后,只能获得一个Wen 资源,然后就断开连接,加入某个页面有多个图片资源需要加载,那么需要连接多次,影响服务器和客户端的性能。
HTTP 2.0:
- HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。
3. HTTP 请求
客户端 -> 发送请求(Request)->服务器
请求包含:请求行,请求头,请求主体
请求行包含三个信息:请求方式,请求的URL,请求的协议(一般都是HTTP1.1)
访问百度:
- Request URL:https://www.baidu.com/ 请求地址
- Request Method:GET get方法/post方法
- Status Code:200 OK 状态码:200
- Remote(远程) Address:14.215.177.39:443
- Accept:text/html
- Accept-Encoding:gzip, deflate, br
- Accept-Language:zh-CN,zh;q=0.9 语言
- Cache-Control:max-age=0
- Connection:keep-alive
1、请求行
请求行中的请求方式:GET
请求方式:Get,Post,HEAD,DELETE,PUT,TRACT…
- get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
- post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。
2、消息头
- Accept:告诉浏览器,它所支持的数据类型
- Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
- Accept-Language:告诉浏览器,它的语言环境
- Cache-Control:缓存控制
- Connection:告诉浏览器,请求完成是断开还是保持连接
- HOST:主机…/.
4. HTTP 响应
- 服务器 -> 响应(response) ->客户端
响应包含:响应行,响应头,响应体
- 响应行:协议,状态码,响应状态
- 响应头:服务器的信息,服务器发给浏览器的信息(内容的媒体类型,编码,内容长度)
- 响应体:响应的实际内容
访问百度:
- Cache-Control:private 缓存控制
- Connection:Keep-Alive 连接
- Content-Encoding:gzip 编码
- Content-Type:text/html 类型
1、响应体
- Accept:告诉浏览器,它所支持的数据类型
- Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
- Accept-Language:告诉浏览器,它的语言环境
- Cache-Control:缓存控制
- Connection:告诉浏览器,请求完成是断开还是保持连接
- HOST:主机…/.
- Refresh:告诉客户端,多久刷新一次;
- Location:让网页重新定位;
2、响应状态码
200:请求响应成功 200
3xx:请求重定向(重定向:你重新到我给你新位置去;)
4xx:找不到资源 404
5xx:服务器代码错误 500 502:网关错误
常见面试题:
-Language**:告诉浏览器,它的语言环境
- Cache-Control:缓存控制
- Connection:告诉浏览器,请求完成是断开还是保持连接
- HOST:主机…/.
4. HTTP 响应
- 服务器 -> 响应(response) ->客户端
响应包含:响应行,响应头,响应体
- 响应行:协议,状态码,响应状态
- 响应头:服务器的信息,服务器发给浏览器的信息(内容的媒体类型,编码,内容长度)
- 响应体:响应的实际内容
访问百度:
- Cache-Control:private 缓存控制
- Connection:Keep-Alive 连接
- Content-Encoding:gzip 编码
- Content-Type:text/html 类型
1、响应体
- Accept:告诉浏览器,它所支持的数据类型
- Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
- Accept-Language:告诉浏览器,它的语言环境
- Cache-Control:缓存控制
- Connection:告诉浏览器,请求完成是断开还是保持连接
- HOST:主机…/.
- Refresh:告诉客户端,多久刷新一次;
- Location:让网页重新定位;
2、响应状态码
200:请求响应成功 200
3xx:请求重定向(重定向:你重新到我给你新位置去;)
4xx:找不到资源 404
5xx:服务器代码错误 500 502:网关错误
常见面试题:
当你的浏览器中地址栏输入地址并回车的一瞬间到页面能够展示回来,经历了什么?