Web
Web:全球广域网,也称为万维网(www),能够通过浏览器访问的网站。
JavaWeb:是用Java技术来解决相关web互联网领域的技术栈
JavaWeb技术栈
B/S架构: Browser/Server, 浏览器/服务器架构模式,它的特点是,客户端只需要浏览器,应用程序的逻辑和数据都存储在服务器端。浏览器只需要请求服务器,获取Web资源,服务器把Web资源发送给浏览器即可。
- 好处:易于维护升级:服务器端升级后,客户端无需任何部署就可以使用到新的版本。
请求和响应
HTTP
HyperText Transfer Protocol,超文本传输协议,规定了浏览器和服务器之间数据传输的规则。
HTTP协议特点
HTTP请求数据格式
HTTP响应数据格式
Web服务器-Tomcat
Web服务器是一个应用程序(软件),对HTTP协议的操作进行封装,使得程序员不必直接对协议进行操作,让Web开发更加便捷。主要功能是“提供网上信息浏览服务”。
Tomcat是Apache软件基金会一个核心项目,是一个开源免费的轻量级Web服务器,支持Servlet/JSP少量JavaEE规范。 Tomcat也被称为Web容器、Servlet容器。 Servlet需要依赖于Tomcat才能运行。
安装
IDEA创建Maven Web项目
使用骨架
不使用骨架
IDEA使用Tomcat
1、集成本地Tomcat
2、使用Tomcat Maven插件
Servlet
Servlet是Java提供的一门动态web资源开发技术
Servlet是JavaEE规范之一,其实就是一个接口,将来我们需要定义Servlet类实现Servlet接口,并由web服务器运行Servlet
快速入门
Servlet执行流程
Servlet生命周期
Servlet体系结构
HttpServlet使用步骤:
- 继承HttpServlet
- 重写doGet和doPost方法
HttpServlet原理:
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
Servlet urlPattern配置
Servlet要想被访问,必须配置其访问路径(urlPattern)。一个Servlet,可以配置多个urlPattern。
@WebServlet(urlPatterns = {"/demo1","/demo2"})
urlPattern 配置规则:
- 精确匹配
- 目录匹配
- 扩展名匹配
- 任意匹配
XML配置方式编写Servlet
Servlet 从3.0版本后开始支持使用注解配置,3.0版本前只支持web.XML配置文件的配置方式。
web.XML配置步骤: - 1.编写Servlet类
- 2.在web.xml中配置该Servlet
Request&Response
- Request:获取请求数据
- Response:设置响应数据
Tomcat需要解析请求数据,封装为request对象, 并且创建request对象传递到service方法中。使用request对象,查阅JavaEE API文档的HttpServletRequest接口。
Request继承体系
Request获取请求数据
@WebServlet("/req1")
public class ServletDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();//GET
System.out.println(method);
String contextPath = req.getContextPath();
System.out.println(contextPath);///tomcat-demo1
StringBuffer requestURL = req.getRequestURL();
System.out.println(requestURL.toString());//http://localhost/tomcat-demo1/req1
String requestURI = req.getRequestURI();
System.out.println(requestURI);///tomcat-demo1/req1
String queryString = req.getQueryString();
System.out.println(queryString);//user=an&pass=66
String agent = req.getHeader("user-agent");//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36
System.out.println(agent);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//另外写一个表单post提交数据
//form method="post" action="/tomcat-demo1/req1"
BufferedReader reader = req.getReader();
String line = reader.readLine();
System.out.println(line);//username=dmanan&password=999999
}
}
Request通用方式获取请求参数
@WebServlet("/req2")
public class ServletDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String method = req.getMethod();
System.out.println(method);
Map<String, String[]> map = req.getParameterMap();
for (String key : map.keySet()) {
System.out.print(key+":");
String[] vals = map.get(key);
for (String val : vals) {
System.out.print(val+" ");
}
System.out.println();
// get...
// username:dm
// password:goushibaba666
// hobby:basketball
}
String[] hobbies = req.getParameterValues("hobby");
for (String hobby : hobbies) {
System.out.println(hobby);
// swim
// basketball
}
String username = req.getParameter("username");
System.out.println(username);
String password = req.getParameter("password");
System.out.println(password);
// anan
// 123
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req,resp);
}
}
参数乱码问题
url编码解码:
GET获取参数的方式: getQueryString
乱码原因,tomcat进行URL解码,默认的字符集是ISO-8859-1
public class UrlDemo {
public static void main(String[] args) throws UnsupportedEncodingException {
String encode = URLEncoder.encode("安安", "utf-8");
System.out.println(encode);//%E5%AE%89%E5%AE%89
String decode = URLDecoder.decode(encode, "utf-8");
System.out.println(decode);//安安
}
}
GET/POST方式的解决(tomcat8以前)
// 解决get乱码
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
username = new String(bytes, StandardCharsets.UTF_8);
POST方式的解决
req.setCharacterEncoding("utf-8");
(更正:先编码,后解码)
Request请求转发
请求转发(forward):一种在服务器内部的资源跳转方式
实现方式:
request.getRequestDispatcher("资源B路径").forward(request,response);
请求转发资源间共享数据:使用Request对象
请求转发特点:
- 浏览器地址栏路径不发生变化
- 只能转发到当前服务器的内部资源
- 一次请求,可以在转发的资源间使用request共享数据
Response
Response设置响应数据功能介绍
Response完成重定向
重定向(Redirect):一种资源跳转方式
// 重定向
// response.setStatus(302);
// response.setHeader("location","resp2");
// 简化方式重定向
response.sendRedirect("resp2");
重定向特点:
- 浏览器地址栏路径发生变化
- 可以重定向到任意位置的资源(服务器内部、外部均可)
- 两次请求,不能在多个资源使用request共享数据
Response响应字符数据
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("爱安安");
writer.write("<h1>香辣鸡腿堡</h1>");
注意:
- 该流不需要关闭,随着响应结束,response对象销毁,由服务器关闭
- 中文数据乱码:原因通过Response获取的字符输出流默认编码:ISO-8859-1
response.setContentType("text/html;charset=utf-8");
Response响应字节数据
FileInputStream fis = new FileInputStream("src/main/webapp/img.png");
ServletOutputStream os = response.getOutputStream();
// byte[] bytes = new byte[1024];
// int len;
// while ((len=fis.read(bytes))!=-1){
// os.write(bytes,0,len);
// }
// 简化
IOUtils.copy(fis,os);
fis.close();
案例
用户登录
1、静态页面,写到webapp目录下
2、创建数据库,创建user表,创建User实体类
3、导入MyBatis坐标,导入MySQL驱动坐标
4、创建mybatis-config.xml核心配置文件,UserMapper.xml映射文件,UserMapper接口
5、创建Servlet,表单提交路径到loginServlet
用户注册
SqlSessionFactory代码优化
public class SqlSessionFactoryUtils {
private static SqlSessionFactory sqlSessionFactory;
// 静态代码块会随着类的加载而自动执行,且只执行一次
static {
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
}
JSP
概念: Java Server Pages,Java服务端页面。一种动态的网页技术,其中既可以定义HTML、JS、CSS等静态内容,还可以定义Java代码的动态内容 JSP = HTML + Java。JSP的作用:简化开发,避免了在Servlet中直接输出HTML标签
JSP脚本
JSP脚本用于在JSP页面内定义Java代码
JSP脚本分类
JSP缺点
EL表达式
Expression Language表达式语言,用于简化JSP页面内的Java代码。主要功能:获取数据
JavaWeb中的四大域对象:
1.page:当前页面有效
2.request:当前请求有效
3. session:当前会话有效
4. application:当前应用有效
el表达式获取数据,会依次从这4个域中寻找,直到找到为止。
JSTL标签
JSP标准标签库(Jsp Standarded Tag Library),使用标签取代JSP页面上的Java代码。
MVC模式和三层架构
MVC是一种分层开发的模式,其中:M: Model,业务模型,处理业务;V: View,视图,界面展示;C: Controller,控制器,处理请求,调用模型和视图。
MVC好处:职责单一,互不影响,有利于分工协作,有利于组件重用。
三层架构:
MVC和三层架构的区别
案例
1、查询所有:
2、添加:
3、修改
会话跟踪技术
会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据
HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。
实现方式:
- 1.客户端会话跟踪技术:Cookie
- 2.服务端会话跟踪技术: Session
Cookie基本使用
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie 原理
Cookie使用细节
Session基本使用
Session:服务端会话跟踪技术,将数据保存到服务端。JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能。
Session原理
Session是基于Cookie实现的
Session使用细节
Cookie和Session的区别
登录注册案例
用户登录:
记住密码
记住用户:
用户注册:
验证码
展示验证码:
校验验证码:
Filter
Filter概念: Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。 讨滤器一般完成─些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等.
Filter快速入门
Filter执行流程
Filter使用细节
过滤器链:一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链。注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序。
案例
Listener
概念:Listener表示监听器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。监听器可以监听就是在application,session,request三个对象创建、销毁或者往其中添加修改删除属性时自动执行代码的功能组件。
Listener使用
AJAX
概念:AJAX(Asynchronous JavaScript And XML):异步的JavaScript和XML。
AJAX作用:
1.与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应的数据。使用了AJAX和服务器进行通信,就可以使用HTML+AJAX来替换JSP页面了
2.异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用校验,等等...
AJAX快速入门
案例
Axios异步框架
Axios对原生的AJAX进行封装,简化书写
快速入门
Axios请求方式别名
案例
JSON
JSON概念: JavaScript Object Notation。JavaScript对象表示法。由于其语法简单,层次结构鲜明,现多用于作为数据载体,在网络中进行数据传输。
JSON基础语法
JSON数据和JAVA对象转换
Fastjson是阿里巴巴提供的一个Java语言编写的高性能功能完善的JSON库,是目前Java语言中最快的JSON库,可以实现Java对象和JSON字符串的相互转换
案例
Vue
Vue是一套前端框架,免除原生JavaScript中的DOM操作,简化书写。基于MVVM(Model-View-ViewModel)思想,实现数据的双向绑定,将编程的关注点放在数据上
Vue快速入门
Vue常用指令
指令:HTML标签上带有v-前缀的特殊属性,不同指令具有不同含义。例如: v-if,v-for...
vue生命周期
生命周期的八个阶段:每触发一个生命周期事件,会自动执行一个生命周期方法(钩子)
案例
Element
Element:是饿了么公司前端开发团队提供的一套基于Vue的网站组件库,用于快速构建网页。组件:组成网页的部件,例如超链接、按钮、图片、表格等等~
快速入门
Element布局
Element组件
查看官网
综合大案例
一、搭建环境
二、查询所有
三、新增品牌
四、代码优化
public class BaseServlet extends HttpServlet {
//根据请求路径的最后一段进行分发
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求路径
String requestURI = req.getRequestURI();
// System.out.println(requestURI);///brand-case/brand/selectAll
//获取最后一段路径 方法名
int index;
index = requestURI.lastIndexOf("/");
String methodName = requestURI.substring(index + 1);
// System.out.println(methodName);//selectAll
//获取字节码对象,获取方法对象,执行方法
//this 谁调用了service方法this就是谁 例如BrandServlet
Class<? extends BaseServlet> c = this.getClass();
try {
Method method = c.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (NoSuchMethodException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
}
五、批量删除
六、分页查询
七、条件分页查询