Javaweb的学习[email protected]的博客-程序员宅基地

技术标签: java  javaweb  

Javaweb(了解原理,底层)

javaweb

1.1javaweb的概念

  • web开发

    • 静态web
      • html,css
      • 提供给所有人看的数据始终不会发生变化!
    • 动态web
      • 提供给所有人看的数据始终会发生变化,因人而异
      • 技术栈:Servlet/jsp/ASP/php

    在java中,动态web资源开发的技术统称为JAVAWEB

1.2 web应用程序

作用:提供给浏览器访问

  • URL统一资源定位符
  • 这个统一的web资源会被放在同一个文件夹,web应用程序—>Tomcat:服务器
  • 一个web应用由多部分组成(静态web,动态web)
    • html,css,js
    • jsp,servlet
    • Java程序
    • jar包
    • 配置文件(Properties)

1.3静态web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5rLPrlf-1624601753284)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518215218017.png)]

缺点:

  • 展示的页面不变化
  • 无法与数据库交互

1.4动态web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IyD2E4ZK-1624601753286)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518215758589.png)]

缺点:

  • 假如服务器的动态web资源出现了错误,需要重新编写后台程序,重新发布;
    • 停机维护

优点:

  • web页面可以更新动态,所有用户看到都不是同一个页面
  • 它可以与数据库交互(数据持久化)

1.5web服务器

处理用户请求,给用户返回响应

tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现,Tomcat 5支持最新的Servlet 2.4 和JSP 2.0 规范。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。对于一个初学者来说,可以这样认为,当在一台机器上配置好Apache 服务器,可利用它响应HTML标准通用标记语言下的一个应用)页面的访问请求。实际上Tomcat是Apache 服务器的扩展,但运行时它是独立运行的,所以当你运行tomcat 时,它实际上作为一个与Apache 独立的进程单独运行的。

诀窍是,当配置正确时,Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器独立的Servlet容器是Tomcat的默认模式。不过,Tomcat处理静态HTML的能力不如Apache服务器。目前Tomcat最新版本为10.0.5**。**

1.6HTTP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PrCXAM5G-1624601753287)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519212708515.png)]

Tomcat

下载tomcat:

  • 安装,解压

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGFvOUS0-1624601753288)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518221243411.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9APvbO9g-1624601753290)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518221735737.png)]

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97fwsXGB-1624601753291)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518225647012.png)]

配置我们启动tomcat的页面:

配置端口号

配置localhost

打开tomcat服务器,启动我们创建的网页

模仿(默认访问ROOT,新建一个文件在里面存放我们的页面–让他访问)

  • 配置文件和目录结构

  • 作用

  • 异常解决:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I0HBIYZy-1624601753292)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210518225451876.png)]

netstat -p tcp -ano | findstr :8080查看这个端口号谁在使用

tasklist | findstr 8080 查看这个进程名字

taskkill -PID 8080 -F 强制结束这个进程

我们如何访问一个网站

Maven(工具)

1.为什么要学这个?

  • 在javaweb开发中需要导入大量的jar包,手动导入
  • 自动导入—maven(自动帮我们导入和配置jar包)
  • maven:方便我们导入jar包

2.Maven的下载

mavan的核心思想:约定大于配置

按照MAVEN给我们的约束,规则去编写

  • 安装,解压

    官网下载

  • 配置文件和目录结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ti8soLnx-1624601753293)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519231358930.png)]

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqFu0lAF-1624601753294)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519231513817.png)]

    配置文件(配置镜像,maven-repo本地仓库)

    • 添加环境变量

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pPKAu9Op-1624601753294)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519231724582.png)]

    • 命令行输入maven-version测试是否成功

  • 作用

    • 方便我们导入jar包

3.IDEA中使用maven

1.创建mavae项目
  • 模板创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xEeaf5UN-1624601753296)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519221309658.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6hZMangW-1624601753297)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519221702808.png)]

自动配置,测试成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QORi5f8S-1624601753298)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519222131058.png)]

maven进行相关配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-loG8eMTc-1624601753299)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519222717004.png)]

  • 自己配置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xDdZ8FfL-1624601753300)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519223337045.png)]

mark(标记目录)

2.创建tomcat

点击创建

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yBckRV5c-1624601753300)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519232108159.png)]

进行相关设置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZInG7iGd-1624601753301)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519224708934.png)]

error:传入我们tomcat路径

waring:没有项目—创建项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v1eFh0If-1624601753302)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210519225019636.png)]

  • 创建成功,启动tomcat(默认访问webapp下的网页,通过设置context指定访问)
  • 手动启动tomcat(web服务器–我们网页就存放在这个服务器下的文件里)
3.maven配置
  • 在资源导出时需要注意去配置

Servlet

1.什么是Servlet

  • Servlet是指任何实现了这个Servlet接口的类

  • 主要功能在于交互式地浏览和生成数据,生成动态Web内容

2.怎样使用

  • 实现了这个Servlet接口
    • 编写一个类实现这个接口
    • 把开发好的JAVA类部署到服务器上
  • Servlet可以响应任何类型的请求

3.HelloServlet

  • 修改web.xml为最新的,配置maven相应结构
  • 创建一个servlet类,继承HttpServlet
  • 编写Servlet配置映射:通过浏览器访问,需要web服务器(tomcat),因此需要我们在web服务器中注册Servlet,提供一个映射访问我们的JAVA程序,响应给我们
  • 配置comcat

4.Servlet原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7gwg9WWG-1624601753303)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210521001143903.png)]

5.Servlet和Servlt_mapping

  • 一个Servlet对应一个请求映射

     <servlet>
        <servlet-name>helloServlet</servlet-name>
        <servlet-class>com.lcj.servlet.HelloServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!--请求路劲-->
        <url-pattern>/lcj</url-pattern>
    
  • 一个Servlet对应多个请求映射()

      <servlet-mapping>
        <servlet-name>helloServlet</servlet-name>
        <!--请求路劲-->
        <url-pattern>*.lcj</url-pattern>
    
  • 默认映射

    /*

  • 映射优先级

​ 固定设置的映射优先级高,找不到访问通配符

6.ServletContext

代表当前web应用

WEB容器在启动时,它会为每个WEB应用**程序都创建一个对应的ServletContext对象,它代表当前web应用

ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,可以通过ServletConfig.getServletContext方法获得ServletContext对象。

由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯

1.共享数据
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        String name = "hanhantt";
        servletContext.setAttribute("username",name);//设置属性,void setAttribute(String var1, Object var2);
    }
    
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        String url = servletContext.getInitParameter("url");
        String username = (String)servletContext.getAttribute("username");//得到这个对应的值
        resp.setContentType("text.html");//设置相应内容类型
        resp.getWriter().println(username);
        resp.getWriter().println(url);

    }
}
2.获取初始化配置参数
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        String url = servletContext.getInitParameter("url");
        String username = (String)servletContext.getAttribute("username");//得到这个对应的值
        resp.setContentType("text.html");//设置相应内容类型
        resp.getWriter().println(username);
        resp.getWriter().println(url);

    }
}
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306//users</param-value>
  </context-param>
3.请求转发–转发都另外一个页面

A-(发送请求,获取资源)------B(拿C的资源,返回给A)-------C url不变

        ServletContext servletContext = getServletContext();
        servletContext.getRequestDispatcher("/read").forward(req,resp);

        Properties properties = new Properties();
4.读取资源文件

注意读取JAVA下的资源文件需要去配置可读取配置文件

5.多余配置文件
<finalName>javaweb-maven</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
  <plugins>
    <plugin>
      <artifactId>maven-clean-plugin</artifactId>
      <version>3.1.0</version>
    </plugin>
    <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
    <plugin>
      <artifactId>maven-resources-plugin</artifactId>
      <version>3.0.2</version>
    </plugin>
    <plugin>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.8.0</version>
    </plugin>
    <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.22.1</version>
    </plugin>
    <plugin>
      <artifactId>maven-war-plugin</artifactId>
      <version>3.2.2</version>
    </plugin>
    <plugin>
      <artifactId>maven-install-plugin</artifactId>
      <version>2.5.2</version>
    </plugin>
    <plugin>
      <artifactId>maven-deploy-plugin</artifactId>
      <version>2.8.2</version>
    </plugi  </plugins>
</pluginManagement>

HTTP 响应代码

  • 成功响应200
  • 重定向(302)
  • 请求转发(307)
  • 客户端响应400
    • 请求失败404,请求所希望得到的资源未被在服务器上发现

    • 服务端响应(500)

      • 服务端出错

HttpServletRequest req

请求对象

用户通过HTTP协议访问服务器,Http请求的所有信息都被封装到HttpServletRequest,我们可以去获取

  • 请求转发:url不变

    重定向:url变

  • 获取前端传递来的参数

    req.setCharacterEncoding("utf-8");
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    String[] parameterValues = req.getParameterValues("hobbys");
    System.out.println(username);
    System.out.println(password);
    System.out.println(Arrays.toString(parameterValues));
    resp.setCharacterEncoding("utf-8");
    //req.getRequestDispatcher("/success.jsp").forward(req,resp);
    resp.sendRedirect("/success.jsp");
    

HttpServletResponse resq

响应对象

  • 向浏览器发送消息

  • 下载文件(输入流读取文件,输出流输出文件,浏览器以下载的方式打开文件)

    //1.设置在浏览器下载,设置响应头控制浏览器以下载的形式打开文件,文件名可以为中文resp.setHeader("content-disposition","attachment;filename="+ URLEncoder.encode("055.jpg","UTF-8"));//2.创建输入流读取文件InputStream ras = getServletContext().getResourceAsStream("/WEB-INF/classes/055.jpg");byte[] buffer = new byte[1024];int len = 0;//3.创建输出流,输出文件到浏览器ServletOutputStream os = resp.getOutputStream();while ((len = ras.read(buffer))>0){    os.write(buffer);}//关闭资源ras.close();os.close();
    
  • 响应头–设置浏览器

    "content-disposition","attachment;filename="+ URLEncoder.encode("055.jpg","UTF-8")content-disposition: attachment;filename=055.jpg        响应头:HTTP/1.1 200 refresh: 3expires: Wed, 31 Dec 1969 23:59:59 GMTCache-Control: no-cacheContent-Type: image/jpegTransfer-Encoding: chunkedDate: Mon, 24 May 2021 16:02:58 GMTKeep-Alive: timeout=20Connection: keep-alive
    
  • 验证码(生成指定长度随机数字符串)

    public class Vcode extends HttpServlet {
              @Override    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
                  //设置响应头        //设置浏览器3秒自动刷新        resp.setHeader("refresh","3");        //设置浏览器以图片的形式打开        resp.setContentType("image/jpeg");        resp.setDateHeader("expires",-1);        resp.setHeader("Cache-Control","no-cache");        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);        Graphics2D graphics = (Graphics2D)image.getGraphics();        graphics.drawString(range(),0,20);        //把图片写给浏览器        ImageIO.write(image, "jpg", resp.getOutputStream());    }    public String range(){        //返回一个指定长度的随机数字        Random random = new Random();        String s = random.nextInt(9999999) + "";        StringBuffer sb = new StringBuffer();        for (int i = 0; i < 7-s.length(); i++) {            sb.append("0");        }        //保证我们得到一个7位随机数        String num = sb.toString()+s;        return num;    }
    

Cooike

服务器给了一个Cooike,证明你来过,你下次来的时候带着这个Cooike,我就知道你来过

客户端 服务器

第一次请求(无Cooike) 响应给你一个Cooike(可以设置信息)

得到这个信息,第二次请求 根据你请求的Cooike响应对应东西给你

  • 避免重复登录

  • public void setMaxAge(int expiry) {
          maxAge = expiry;   }       public Cookie(String name, String value) {
          }        public String getName() {
          	return name;    }        public String getValue() {
          	return value;    }//获取Cooike,响应Cooike
    
  • URLEncoder.encode("055.jpg","UTF-8")//可对中文进行编码URLEncoder.decode("055.jpg","UTF-8")//可对中文进行解码
    

Session

Session 对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项、信息。例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。

  • 一个Session独占一个浏览器,浏览器没有关闭就一直存在,存储在Session中的信息就可以作用整个应用程序

1.Session的使用

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题    req.setCharacterEncoding("utf-8");    resp.setCharacterEncoding("utf-8");    //得到Session    HttpSession session = req.getSession();    session.setAttribute("name","刘成军");    session.setAttribute("date",new Person("刘成军",18));    //获取SessionId    String id = session.getId();    //判断这个Session是否新创建    if(session.isNew()){        resp.getWriter().println("这是新创建的Session");    }else {        resp.getWriter().println("已经创建了Session,id为:"+id);    }    //}protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {        //解决乱码问题        req.setCharacterEncoding("utf-8");        resp.setCharacterEncoding("utf-8");        resp.setContentType("text.html;charset=utf-8");        //得到Session        HttpSession session = req.getSession();        String name = (String)session.getAttribute("name");        Person p = (Person)session.getAttribute("date");        resp.getWriter().println(name);        resp.getWriter().println(p.toString());        //    }

2.Session的注销

  • 手动

  • 代码

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //解决乱码问题    req.setCharacterEncoding("utf-8");    resp.setCharacterEncoding("utf-8");    resp.setContentType("text.html;charset=utf-8");    //得到Session    HttpSession session = req.getSession();    session.removeAttribute("date");    session.removeAttribute("name");    session.invalidate();
    
  • web.xml中配置

    <session-config>  <session-timeout>10</session-timeout></session-config>
    

3.Session和Cooike的区别

  • Session服务器保存(保存重要信息),Cooike浏览器保存(保存多个)

4.使用场景

Session 对象最常见的一个用法就是存储用户的首选项、信息

  • 例如,如果用户指明不喜欢查看图形,就可以将该信息存储在 Session 对象中。
  • 登录一个访问多个页面.
  • 存储在Session中的信息就可以作用整个应用程序—重要的信息,经常使用的信息

5.图示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yHOnwXzv-1624601753305)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210528161853934.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VxzbNzul-1624601753306)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210528162524137.png)]

Jsp

JSP全名为Java Server Pages,java服务器页面,简化的[Servlet]。在传统的网页HTML(标准通用标记语言的子集)文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件,后缀名为(*.jsp)。 用JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。

它实现了Html语法中的java扩张(以 <%, %>形式)

jsp的存放位置

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BmiwobIJ-1624601753306)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210528164205832.png)]

jsp源码分析

public void _jspInit() {
    //初始化}public void _jspDestroy() {//毁灭}public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException //jsp服务函数(类似于Servlet)  内置对象pageContext pagecontext//页面上下文    session    servletContext    servletconfig    page=this //当前页面JspWriter out = null;JspWriter _jspx_out = null;PageContext _jspx_page_context = null;请求响应//将我们写的JSP转换成JAVA代码前准备工作,通过创建好的对象直接在JSP中使用response.setContentType("text/html;charset=UTF-8");//设置响应类型PageContext pageContext = _jspxFactory.getPageContext(this, request, response, (String)null, true, 8192, true); _jspx_page_context = pageContext;pageContext.getServletContext();//获得ServletContext pageContext.getServletConfig();//获得Servlet配置pageContext.getSession();//获得sessionout = pageContext.getOut();//输出JSP

实现原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oqxGrlmV-1624601753306)(C:\Users\LCJ\AppData\Roaming\Typora\typora-user-images\image-20210529231412462.png)]

  • 在idea中使用Tomcat会在tomcat中生成一个work目录(存放jsp.class文件)

JSP基础语法

JSP表达式

<%--JSP表达式作用:用来将程序的输出,输出到客户端<%= 变量或者表达式%>--%><%= new java.util.Date()%>#### JSP脚本片段```jsp<%--jsp脚本片段--%><%    int sum = 0;    for (int i = 0; i <= 100; i++) {        sum += i;    }    out.println("<h1>Sum=" +sum+ "<h1>" );%>

脚本片段的再实现

<%    int x = 10;    out.println(x);%><p>这是一个JSP文档</p><%    int y = 20;    out.println(y);%><%--在代码中嵌入HTML元素--%><%    for (int i = 0; i < 5; i++) {%>    <h1>Hello world <%=i%></h1><%    }%>

JSP声明

<%!    static{        System.out.println("Loading Servelet!");    }    private int globalVar = 0;    public void oi(){        System.out.println("进入了方法oi");    }%>

JSP声明:会被编译到JSP生成Java的类中!其他的,就会被生成到_jspService方法中!

在JSP中嵌入Java代码即可!

<%%><%=%><%!%><%--注释--%>

JSP的注释不会在客户端显示,HTML就会

8.4、JSP指令

定制错误页面

使用JSP指令

<%--定制错误页面--%><%@ page errorPage="error/500.jsp" %>

另一种办法:在web.xml文件中配置

<error-page>    <error-code>404</error-code>    <location>/error/404.jsp</location></error-page><error-page>    <error-code>500</error-code>    <location>/error/500.jsp</location></error-page><%[email protected]:会将两个页面合二为一--%><%@include file="common/header.jsp"%><hr><h1>网页主体</h1><hr><%@include file="common/footer.jsp"%><%--jsp:include:拼接页面,本质还是三个页面--%><jsp:include page="/common/header.jsp" /><hr><h1>网页主体</h1><hr><jsp:include page="/common/footer.jsp" />
  • 配置错误页面404,500
  • 使用include拼接页面,对于通用的页面我们可以将他放入到指定包下,include导入

8.5、9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application【ServletContext】 存东西
  • Config【ServletConfig】
  • Out
  • Page
  • Exception
<%pageContext.setAttribute("name1","oi1号");//保存的数据只在一个页面中有效request.setAttribute("name2","oi2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据session.setAttribute("name3","oi3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器application.setAttribute("name4","oi4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器%>

request:客户端向服务器发送请求,产生的数据,用户看完就没用了,比如:新闻,用户看完没用的!

session:客户端向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;

application:客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,比如:聊天数据;

  • 设置数据,并取出数据(根据需求将数据存在在相应的对象)

    <%    pageContext.setAttribute("name1","oi1号");//保存的数据只在一个页面中有效    request.setAttribute("name2","oi2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据    session.setAttribute("name3","oi3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器    application.setAttribute("name4","oi4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器%><%    String name1 = (String)pageContext.findAttribute("name1");    String name2 = (String)pageContext.findAttribute("name2");    String name3 = (String)pageContext.findAttribute("name3");    String name4 = (String)pageContext.findAttribute("name4");%><h>${name1}</h><h>${name2}</h><h>${name3}</h><h>${name4}</h></body></html>
    
    <body><% String name3 = (String)session.getAttribute("name3");   String name4 = (String)application.getAttribute("name4");%><h1>登录成功</h1><h2>${name3}</h2><h2>${name4}</h2>
    

8.6、JSP标签、JSTL标签、EL表达式

<!-- JSTL表达式的依赖 --><!-- https://mvnrepository.com/artifact/javax.servlet.jsp.jstl/jstl-api --><dependency>  <groupId>javax.servlet.jsp.jstl</groupId>  <artifactId>jstl-api</artifactId>  <version>1.2</version></dependency><!--standard标签库--><dependency>  <groupId>taglibs</groupId>  <artifactId>standard</artifactId>  <version>1.1.2</version></dependency>

EL表达式:${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象
  • 调用java方法

JSP标签

<%--jsp:include--%><jsp:forward page="jsptag2.jsp">    <jsp:param name="name" value="oi"/>    <jsp:param name="age" value="2+"/></jsp:forward>

JavaBean

MVC三层架构

Filter

对请求进行过滤

  • 根据设置的Session属性,做相应判断(对于多次使用的属性可设为常用变量,避免重复修改)

  • vip练习–根据用户登录设置的Session值做相应判断

  • 相应编码

监听器

JDBC

复习

事务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_46363821/article/details/118219976

智能推荐

前向推理--darknet和ncnn_seiyaaa的博客-程序员宅基地_前向推理

背景最近在训练yolo,得到的best模型结构,输出是两个yolo,那推理时候是使用哪个output呢?yolov3原版是3个yolo节点的yolo的predict代码逻辑执行的命令如下:darknet.exe detector test cfg/coco.data yolov4.cfg yolov4.weights -ext_output dog.jpg结合darknet.c源码可以看出在预测时候,从最后往前找layer type,第一个不是COST类型,就break跳出循环,取出

图像处理之_霍夫(Hough)变换_xieyan0811的博客-程序员宅基地

Hough变换是一种在图像中寻找直线,圆及其它简单形状的方法.当我们对图像进行边缘检测之后,可用Hough变换识别图像中的简单形状.该转换也是对图像的一种抽象(由繁到简).下面介绍最基本Hough变换:寻找直线算法.

Rosalind第81题:Linguistic Complexity of a Genome_automan_huyaoge的博客-程序员宅基地

ProblemGiven a lengthstringformed over analphabetof size, let the "substring count"denote the total number of distinct substrings of. Furthermore, let the "maximum substring count"denote the maximum number of distinct substrings that could a...

gnss二阶锁相环滤波器_乔布斯接班人的博客-程序员宅基地_二阶锁相环环路滤波器

gnss定位之二阶锁相环滤波器锁相环路的滤波器是一阶加上滤波器后面还有一个数控振荡器,锁相环就是二阶环路。环路滤波器的传递函数为:

MC无法更新JAVA_《我的世界》java版更新还不够“水”,看看基岩版的更新就知道了..._Blitzkreig的博客-程序员宅基地

原标题:《我的世界》java版更新还不够“水”,看看基岩版的更新就知道了前世的千百次轮回,才换得今生的一次相遇。为了让小伙伴们更好地了解游戏中的内容,希望大家能动动小手关注一下。本期内容 一直有人抱怨,我的世界java版更新到后期时,基本上处于反复横跳的状态,这样的游戏更新无疑很“水”。其实java版的更新还不够水,如果你看完了基岩版的测试版本更新,就知道是怎么回事了。最近有MC玩家表示,我的世界...

EntityFramework Code-First 简易教程(十)-------多对多_weixin_30730151的博客-程序员宅基地

配置Many-to-Many(多对多)关系:这里有两个类,Student和Course,一个Student可以有多个Course,一个Course也可以有多个Student,所以这就成了多对多关系。更多信息请访问Entity Relationship。进入正题:1.使用DataAnnotation配置多对多关系:Student类中有一个Course的集合属性,在Course类...

随便推点

python写病毒代码_十行 Python 代码写一个USB病毒_weixin_39616686的博客-程序员宅基地

文 | 我爱学[email protected]简书 编辑 | EarlGrey推荐 | 编程派公众号(ID:codingpy)昨天在上厕所的时候突发奇想,当你把usb插进去的时候,能不能自动执行usb上的程序。查了一下,发现只有windows上可以,具体的大家也可以搜索(搜索关键词usb autorun)到。但是,如果我想,比如,当一个usb插入时,在后台自动把usb里的重要文件神不知鬼不觉地拷贝到本地或者上传到某...

epoll详解_一口Linux的博客-程序员宅基地_epoll详解

在linux 没有实现epoll事件驱动机制之前,我们一般选择用select或者poll等IO多路复用的方法来实现并发服务程序。在大数据、高并发、集群等一些名词唱得火热之年代,select和poll的用武之地越来越有限,风头已经被epoll占尽。本文便来介绍epoll的实现机制,并附带讲解一下select和poll。通过对比其不同的实现机制,真正理解为何epoll能实现高并发。select()和poll() IO多路复用模型select的缺点:单个进程能够监视的文件描述符的数量存在最大限制,

python与Geant4接口漫谈_m0_62014296的博客-程序员宅基地

Geant4(GEometry ANd Tracking,几何和跟踪)是由CERN(欧洲核子研究组织)基于C++面向对象技术开发的蒙特卡罗应用软件包,用于模拟粒子在物质中输运的物理过程。它的优点是源代码完全开放,用户可以根据实际需要更改、扩充Geant4程序。Python...

配好lsd_slam后的使用PTAM工具标定相机_YDQN的博客-程序员宅基地

前言:安装配置lsd_slam的方式请参考我的上一篇博客 https://blog.csdn.net/LOVE1055259415/article/details/79874231一、标定你的摄像头刚开始用的是ROS下的标定脚本文件。当然也可以用matlab的toolbox工具箱,这里有文档:http://wenku.baidu.com/link?url=UhysNXTFL9UiHEA-XbXoh...

零基础入门python3.7 ——基础知识总结(四)列表(list)_雯倾浅忆的博客-程序员宅基地

Python 序列(Sequence)是指按特定顺序依次排列的一组数据,它们可以占用一块连续的内存,也可以分散到多块内存中。Python 中的序列类型包括列表(list)、元组(tuple)、字典(dict)和集合(set)。列表(list)和元组(tuple)比较相似,它们都按顺序保存元素,所有的元素占用一块连续的内存,每个元素都有自己的索引,因此列表和元组的元素都可以通过索引(index)...

28.C语言内存管理机制_Rston的博客-程序员宅基地

28.1.内存的重要性及内存管理 28.2.栈的详解 28.2.栈的详解 28.4.堆内存使用范例 28.5.malloc的一些细节表现 28.6.代码段和.data段及bss段 28.7.C语言中变量和常量内存分配