JavaWeb总结性笔记
注:本篇文章总结自b站狂神javaweb教程
1、基本概念
1.1、静态web
无法动态更新的web页面,无法与数据库交互,可以通过js实现伪动态
1.2、动态web
可以动态更新的web页面,实现与数据库交互
2、Http
2.1、Http请求
客户端–>发请求–>服务器
请求行
- 请求行中的请求方式:get,post,head,delete…
- get:请求能携带的参数较少,大小受限,会在url地址栏显示内容,不安全
- post:请求携带的参数没有限制,打小没有限制,不会在url地址栏显示数据内容,安全
消息头
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
2.2、Http响应
服务器–>响应–>客户端
响应体
Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码格式 GBK UTF-8 GB2312 ISO8859-1
Accept-Language:告诉浏览器,它的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成是断开还是保持连接
HOST:主机..../.
Refresh:告诉客户端,多久刷新一次;
Location:让网页重新定位;
响应状态码
200:请求响应成功
3xx:请求重定向
4xx:找不到资源
5xx:服务器代码错误 502:网关错误
3、servlet
3.1、首先在maven里导入依赖,因为要继承httpservlet
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
3.2、实现helloservlet类
package com.zhage.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//防止出现乱码
//将响应和请求都转为utf8,响应格式设置为html
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter writer = resp.getWriter();
writer.print("扎哥啦啦啦");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
3.3、映射helloservlet类
为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需
要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.zhage.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
3.4、配置tomcat
3.5、启动测试
3.6、servlet原理
3.7、关于mapping
一个servlet可以映射多个路径
制定了固有的映射路径优先级最高,如果找不到就会走默认的处理请求
3.8、servletcontext
web在启动的时候,会为每个web程序创建一个对应的servletcontext对象,代表了当前的web应用
3.8.1、使用servletcontext共享数据
setservlet代码
package com.zhage.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class SetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
String name = "扎哥";
servletContext.setAttribute("name",name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
getservlet代码
package com.zhage.servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class GetServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//防止出现乱码
//将响应和请求都转为utf8,响应格式设置为html
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
ServletContext servletContext = this.getServletContext();
String name = (String) servletContext.getAttribute("name");
resp.getWriter().print("name对应的值是:"+name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
直接访问get
先访问set再访问get
3.8.2、实现请求转发
servletdemo01
public class ServletDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext servletContext = this.getServletContext();
System.out.println("进入01");
servletContext.getRequestDispatcher("/sd2").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
servletdemo02
public class ServletDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
resp.getWriter().print("我是ServletDemo02哦,注意url还是sd1嗷");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
结果
3.8.3、更多
可以读取properties资源文件
重定向和请求转发区别
4、Cookie、Session
4.1、Cookie
从请求中拿到cookie
服务器响应给客户端cookie
实现使用cookie保存用户信息
代码
public class CookieServlet01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
//获得cookie
Cookie[] cookies = req.getCookies();
boolean isIn = false;
//遍历cookie
for (Cookie cookie : cookies) {
if(cookie.getName().equals("username"))
{
resp.getWriter().print("您已经被保存了,您的名字是:"+cookie.getValue());
isIn = true;
}
}
//如果没找到
if(!isIn)
{
resp.getWriter().print("您还没有进入过该页面");
Cookie cookie = new Cookie("username", "扎哥");
//添加cookie
resp.addCookie(cookie);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
第一次进入c1
第二次进入c1
可以找到对应的cookie
这个name是之前存错了一次
4.2、Session
session是服务器给每个用户的
一个session对应一个浏览器
使用方法与context类似,就不写代码了
重点是在与区别,context作用域是整个web,session作用域是整个浏览器(这里是鄙人的简短总结,如有不对,请指出)
cookie与session的区别
- cookie是用户存在本地的信息,只能保存字符串
- session是存在服务器中,相当于一个用户独占,所以少写入,保存重要信息,减少服务器资源的浪费
5、jsp
没什么好讲的,语法用到的时候再去找都可以,主要是要懂原理,jsp实际上就是一个servlet,你在jsp里面写的内容,其实都是用servlet一个个写出来的
6、mvc三层架构
Model
- 业务处理 :业务逻辑(Service)
- 数据持久层:CRUD (Dao - 数据持久化对象)
View
- 展示数据
- 提供链接发起Servlet请求 (a,form,img…)
Controller (Servlet)
- 接收用户的请求 :(req:请求参数、Session信息….)
- 交给业务层处理对应的代码
- 控制视图的跳转
7、Filter
直接用一个例子,用户没有登录就无法进入lalala页面
loginservlet,用来实现注入session,实际应用是表单传入的参数实现注册
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//在这个页面将username注入session
HttpSession session = req.getSession();
session.setAttribute("username", URLEncoder.encode("扎哥","utf-8"));
resp.sendRedirect("/filter/lalala");
}
}
mainservlet,如果session里有用户信息,则可以进入的页面
过滤器
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
HttpSession session = req.getSession();
if(session.getAttribute("username")==null)
{
System.out.println("没有登录");
resp.sendRedirect("/filter/index.jsp");
}
//让过滤器继续往下走
chain.doFilter(request,response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
web.xml里实现filter的映射,将/lalala加入过滤器,每次访问lalala就会执行这个过滤器
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.zhage.filter.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/lalala</url-pattern>
</filter-mapping>
若直接 进入/lalala,因为没注入session,所有过滤器会跳转到index
进入login之后
成功进入了lalala,这之后再尝试直接进入lalala,还是可以。
最后最后
其实我就只是跟着流程走了一遍,smbms也没有去做,主要是直冲springboot,前面的知识主要是要懂,理解