JavaWeb

1. 基本概念

web开发:

  • 静态web:提供给所有人看的数据始终不会发生变化
  • 动态web
    • 提供给所有人看的数据始终会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同
    • 技术栈:Servlet/ JSP , ASP,PHP

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

2. web服务器

2.1 相关技术

ASP:

  • 来自微软,是国内最早流行的
  • 在HTML中嵌入了VB的脚本,ASP+COM
  • 在ASP开发中,基本的一个页面都有几千行的业务代码,页面极其混乱,维护成本高

PHP:

  • PHP开发速度很快,功能很强大,跨平台,代码很简单
  • 局限性:无法承载大访问量的情况

JSP/Servlet:

  • sun公司主推的B/S架构(浏览器和服务器)
  • 基于Java语言的
  • 可以承载三高问题带来的影响

2.2 web服务器

服务器是一种被动的操作,用来处理用户的一些请求和给用户一些响应信息。

IIS

微软的,处理ASP,Windows中自带的

Tomcat

技术先进,性能稳定;用来开发和调试JSP程序的首选

3. HTTP

3.1 什么是HTTP

HTTP(超文本传输协议)是一个简单地请求响应协议,它通常运行在TCP上。

  • 文本:html,字符串…
  • 超文本:图片,音乐,视频,定位,地图…

3.2 两个时代

HTTP 1.0

  • 客户端与web服务器连接后,只能获得一个web资源

HTTP 2.0

  • 客户端可以与web服务器连接后,可以获得多个web资源

3.3 HTTP请求

  • 客户端----发请求-----服务器

1、请求行

  • 请求行中的请求方式:get,post
  • get:请求能够携带的参数比较少,大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
  • post:请求能够携带的参数比较多,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效

2、消息头

Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码方式  GBK UTF-8  GB2312
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成后是断开还是保持连接
Host:主机

3.4 HTTP响应

  • 服务器-----响应-----客户端

1、响应体

Accept:告诉浏览器,它所支持的数据类型
Accept-Encoding:支持哪种编码方式  GBK UTF-8  GB2312
Accept-Language:告诉浏览器他的语言环境
Cache-Control:缓存控制
Connection:告诉浏览器,请求完成后是断开还是保持连接
Host:主机
Refrush:告诉客户端多久刷新一次
Location:让网页重新定位

2、响应状态码

200:请求响应成功

3XX:请求重定向

404:找不到资源

5xx:服务器代码错误 502网关错误

4. Maven

4.1 什么是Maven

Maven项目架构管理工具,目前用来方便导入jar包。

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

  • 有约束,不要去违反

Maven会规定好你该如何去编写我们的java代码,必须要按照这个规范来。

4.2 阿里云镜像

镜像:mirrors 作用:加速我们的下载

国内建议使用阿里云的镜像

<mirror>
    <id>nexus-aliyun</id>
    <mirrorOf>central</mirrorOf>
    <name>Nexus aliyun</name>
    <url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>

4.3 本地仓库

本地仓库:localRepository

<localRepository>D:\Source\apache-maven-3.8.6\maven-repo</localRepository>

4.4 在IDEA中使用Maven

根据模板

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

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

普通

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

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

4.5 IDEA中配置Tomcat

4.6 pom文件

<!--在build中配置resources,来防止资源导出失败的问题-->
    <build>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

4.7 解决遇到的问题

  1. IDEA每次都要重复配置Maven

    在IDEA的全局默认配置中去修改

    image-20220902083141826
  2. web.xml里的版本问题

    默认的web.xml版本太老了,应该与Tomcat里web.xml里的一致(3.1)。

    <?xml version="1.0" encoding="UTF-8"?>
    -<web-app metadata-complete="true" version="3.1" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    
    <display-name>Welcome to Tomcat</display-name>
    
    <description>Welcome to Tomcat </description>
    
    </web-app>
    

    4.8 Maven仓库的使用

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

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

2.浏览器中文显示乱码问题


     //设置编码方式为utf-8
resp.setCharacterEncoding("UTF-8");

```

5. Servlet

Servlet接口Sun公司有两个默认的实现类:HttpServlet,GenericServlet

5.1 Servlet概述

  • Servlet是sun公司开发动态web的一门技术

  • Sun在这些API中提供了一个接口Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤:

    • 编写一个类,实现Servlet接口
    • 把开发好的java类部署到web服务器中

    把实现了Servlet接口的java程序叫做Servlet

5.2 HelloServlet

  1. 创建一个普通的Maven项目,删掉里面的src目录,以后我们的学习就在这个项目中建立Module;这个空的工程就是Maven主工程

  2. 关于Maven父子工程的理解

    父项目中会有

    <modules>
            <module>servlet-01</module>
        </modules>
    

​ 子项目中会有

 <parent>
        <artifactId>Servlet01</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目中的jar包子项目可以直接使用

3.Maven环境优化

  • 修改web.xml修改为最新的
  • 将Maven的结构搭建完整
  1. 编写一个Servlet程序
    1. 编写一个普通类
    2. 实现Servlet接口,这里我们直接继承HttpServlet
public class HelloServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        PrintWriter writer=resp.getWriter();//响应流
        writer.printf("Hello,Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}
  1. 编写Servlet的映射(在web.xml中)

    为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要在web服务中注册我们写的Servlet,还需要给他一个浏览器能够访问的路径。

    <!--        注册Servlet-->
            <servlet>
                    <servlet-name>hello</servlet-name>
                    <servlet-class>Servlet.HelloServlet</servlet-class>
                    
            </servlet>
    <!--        Servlet的请求路径-->
            <servlet-mapping>
                    <servlet-name>hello</servlet-name>
                    <url-pattern>/hello</url-pattern>
            </servlet-mapping>
    
  2. 配置Tomcat

    配置项目发布的路径就可以了

  3. 启动测试,OK

5.3 Servlet原理

Servlet是由web服务器调用,web服务器在收到浏览器请求后,会

5.4 Mapping问题

1、一个Servlet可以指定一个映射路径

<servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>
<!--        Servlet的请求路径-->
<!--        http://localhost:8080/servlet_01/hello-->
        <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello</url-pattern>
        </servlet-mapping>

2、一个Servlet可以指定多个映射路径

<servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>
<!--        Servlet的请求路径-->
<!--        http://localhost:8080/servlet_01/hello-->
       
        <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello2</url-pattern>
        </servlet-mapping>
         <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello3</url-pattern>
        </servlet-mapping>

3、一个Servlet可以指定通用映射路径

 <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>

        <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/hello/*</url-pattern>
        </servlet-mapping>

4、默认请求路径

 <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>

        <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>/*</url-pattern>
        </servlet-mapping>

5、一个Servlet可以指定一些后缀或者前缀等

 <servlet>
                <servlet-name>hello</servlet-name>
                <servlet-class>Servlet.HelloServlet</servlet-class>

        </servlet>
<!--        Servlet的请求路径-->
<!--        http://localhost:8080/servlet_01/hello-->
        <servlet-mapping>
                <servlet-name>hello</servlet-name>
                <url-pattern>*.jyh</url-pattern>
        </servlet-mapping>

6、优先级问题

指定了固有的映射路径优先级最高,如果找不到就转到默认的处理请求。

<!--        404-->
        <servlet>
                <servlet-name>error</servlet-name>
                <servlet-class>Servlet.ErrorServlet</servlet-class>
        </servlet>
        <servlet-mapping>
                <servlet-name>error</servlet-name>
                <url-pattern>/*</url-pattern>
        </servlet-mapping>

5.5 ServletContext

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

1.共享数据

我在这个Servlet中保存的数据,可以在另外一个Servlet中拿到

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        ServletContext context = this.getServletContext();
        String username="jyh";
        context.setAttribute("username",username);//将数据保存在ServletContext中,名字为username,值为username
        System.out.println("hello");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
       String username =(String) (context.getAttribute("username"));//getAttribute()获得指定属性名的属性值

       resp.setContentType("text/html");
       resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("名字为:"+username);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

<servlet>
    <servlet-name>GetServlet</servlet-name>
    <servlet-class>servlet.GetServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>GetServlet</servlet-name>
    <url-pattern>/getcontext</url-pattern>
  </servlet-mapping>

测试访问结果:先去 hello界面再到getcontext,获得username

2、获取初始化参数

<!--  配置一些web应用初始化参数-->
  <context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
  </context-param>
public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");//获取web.xml中初始化参数
        resp.getWriter().print(url);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      doGet(req, resp);
    }
}

3、请求转发

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        System.out.println("进入了sd4");;
        //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/getparam");//转发的请求路径
        //requestDispatcher.forward(req,resp);//调用forward实现请求转发
        context.getRequestDispatcher("/getparam").forward(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
    <servlet-name>sd4</servlet-name>
    <servlet-class>servlet.ServletDemo04</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd4</servlet-name>
    <url-pattern>/sd4</url-pattern>
  </servlet-mapping>

4、读取资源文件

Properties

  • 在java目录下新建properties
  • 在resources目录下新建properties(推荐)

都被打包到classes目录下,这个路径俗称classpath

思路:需要一个文件流

username=root
password=123456

<servlet>
    <servlet-name>sd5</servlet-name>
    <servlet-class>servlet.ServletDemo05</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>sd5</servlet-name>
    <url-pattern>/sd5</url-pattern>
  </servlet-mapping>
public class ServletDemo05 extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
            Properties properties = new Properties();
            properties.load(is);
            String username = properties.getProperty("username");
            String password = properties.getProperty("password");
            resp.getWriter().print("username:"+username);
            resp.getWriter().print("password:"+password);
        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
    }
}

5.6 HttpServletResponse

web服务器接收到客户端的http请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应的一个HttpServetResponse

  • 如果要获取客户端请求过来的参数,找HttpServletRequest
  • 如果要给客户端响应一些信息,找HttpServletRequest

1. 简单分类

负责向浏览器发送数据的方法

public ServletOutputStream getOutputStream() throws IOException
public PrintWriter getWriter() throws UnsupportedEncodingException

负责向浏览器发送响应头的方法

public void setContentLength(int len)
public void setContentLengthLong(long len) 
public void setHeader(String name, String value)
public void setDateHeader(String name, long date);
public void setCharacterEncoding(String var1);
public void setContentLength(int var1);
public void setContentType(String var1);

2. 常见应用

  • 向浏览器输出消息

  • 下载文件

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          //1. 获取文件的下载路径
            String realPath = "D:\\java\\javaweb\\Servlet01\\response\\target\\classes\\green.jpg";
            System.out.println("下载文件的路径:"+realPath);
            // 2. 下载的文件名是什么?
            String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
            //3. 设置想办法让浏览器能够支持(Content-Disposition)下载我们需要的东西,URLEncoder.encode("filename","utf-8")解决文件名中文乱码问题
            resp.setHeader("Content-Disposition","attachment;fileName="+ URLEncoder.encode("filename","utf-8"));
           //4. 获取下载文件的输入流
            FileInputStream in = new FileInputStream(realPath);
            //5. 创建缓冲区
            int len=0;
            byte[] buffer = new byte[1024];
            //6. 获取OutputStream对象
            ServletOutputStream out= resp.getOutputStream();
            //7. 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输出到客户端
            while ((len=in.read(buffer))>0){
                out.write(buffer,0,len);
    
            }
            out.close();
            in.close();
    
        }
    
  • 验证码功能

       @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //如何让浏览器3s自动刷新一次
            resp.setHeader("refresh","3");
            //在内存中创建一张图片
            BufferedImage image = new BufferedImage(60,20,BufferedImage.TYPE_INT_RGB);
            //得到图片
            Graphics2D graphics = (Graphics2D) image.getGraphics();//笔
            //设置图片的背景颜色
            graphics.setBackground(Color.white);
            graphics.fillRect(0,0,60,20);
            //给图片写数据
            graphics.setColor(Color.BLUE);
            graphics.setFont(new Font(null,Font.BOLD,20));
            graphics.drawString(makeNum(),0,20);
    
            //告诉浏览器,这个请求用图片形式打开
            resp.setContentType("image/jpeg");
            //网站存在缓冲,不让其缓存
            resp.setDateHeader("expires",-1);
            resp.setHeader("Cache-Control","no-cache");
            resp.setHeader("Pragma","no-cache");
            //把图片写给浏览器
            ImageIO.write(image,"jpg",resp.getOutputStream());
    
        }
    
        //生成随机数
        private String makeNum(){
            Random random = new Random();
            String num=random.nextInt(9999)+"";
            StringBuffer stringBuffer = new StringBuffer();
            for (int i = 0; i <4-num.length() ; i++) {
                stringBuffer.append("0");
            }
            String s= stringBuffer.toString()+num;
            return num;
        }
    
    
  • 实现重定向

    一个web资源收到客户端请求后,它会通知客户端去访问另一个web资源,这个过程叫做重定向。

    常见场景:用户登录

     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("进入了重定向");
    //        resp.setHeader("Location","/response_war/image");
    //        resp.setStatus(302);
            resp.sendRedirect("/response_war/image");
        }
    

重定向与转发的区别

相同点:页面都会发生跳转

不同点:请求转发的时候,URL不发生变化;重定向的时候,URL发生变化

5.7 HttpServletRequest

常见应用

  • 获取前端传递的参数和请求转发

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            String username=req.getParameter("username");
            String password=req.getParameter("password");
            String[] hobby = req.getParameterValues("hobby");
    
            System.out.println("------------------------------");
            System.out.println(username);
            System.out.println(password);
            System.out.println(Arrays.toString(hobby));
            System.out.println("-----------------------------");
    
            //通过请求转发
            //这里的“/”代表当前的web应用
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }
    

6.Cookie 、Session

6.1 会话

用户打开一个浏览器,点击了很多个超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

6.2 保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息。我们可以把信息或数据放在Session中

常见应用:网站登录后,下次进入不用再登录直接进去了

6.3 Cookie

1、从请求中获得cookie信息

2、服务器响应给客户端cookie

  Cookie[] cookies = req.getCookies();//获得cookie
  cookie.getName();//获得cookie中的key
  cookie.getValue();//获得cookie中的value
  Cookie cookie = new Cookie("lasttime", System.currentTimeMillis()+"");//创建一个cookie
  cookie.setMaxAge(60);//设置cookie有效期
  resp.addCookie(cookie);//响应给客户端一个cookie

删除cookie

1、不设置cookie有效期,关闭浏览器,自动失效

2、设置有效期为0

6.4 Session(重点)

什么是Session

  • 服务器会给每一个用户(浏览器)创建一个Session浏览器

  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在

  • 例子:用户登录之后,整个网站都可以访问

Cookie与Session的区别

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务器创建

使用场景:

  • 保存一个登录用户的信息
  • 购物车信息
  • 在整个网站中经常会使用的数据,我们将它保存在Session中

使用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中存东西
        session.setAttribute("name",new Person("jyh",20));

        //获取session的id
        String id = session.getId();
        System.out.println(id);

        //判断Session是否为新的
        if (session.isNew()){
            resp.getWriter().print("Session创建成功,ID为:"+id);
        }
        else
            resp.getWriter().print("Session已经在服务器中存在了,id:"+id);
        //session在创建时做了什么事情:
        //Cookie cookie = new Cookie("JSESSIONID", id);
       // resp.addCookie(cookie);
     
      //手动注销session
       session.removeAttribute("name");
        session.invalidate();
    }

会话自动过期(web.xml中配置):

<!--    设置Session默认的失效时间-->
    <session-config>
<!--        1 min后session自动失效-->
        <session-timeout>1</session-timeout>
    </session-config>

7. JSP

7.1 什么是jsp

Java Server Pages:java服务器页面,也和Servlet一样,用于动态web技术!

最大特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面可以嵌入Java代码,为用户提供动态数据

7.2 JSP原理

思路:JSP到底怎么执行的

  • 代码层面没问题

  • 服务器内部工作:Tomcat中有一个work目录,IDEA中使用也有work目录,JSP最终会转换为java类

    JSP本质上就是Servlet

    jsp的工作:

    1.判断请求

    2.内置一些对象

    	final javax.servlet.jsp.PageContext pageContext;
        final javax.servlet.ServletContext application;
        final javax.servlet.ServletConfig config;
        javax.servlet.jsp.JspWriter out = null;
        final java.lang.Object page = this;
        javax.servlet.jsp.JspWriter _jspx_out = null;
        javax.servlet.jsp.PageContext _jspx_page_context = null;
    

    3.输出页面前增加的代码

     response.setContentType("text/html; charset=UTF-8");
          pageContext = _jspxFactory.getPageContext(this, request, response,
          			null, false, 8192, true);
          _jspx_page_context = pageContext;
          application = pageContext.getServletContext();
          config = pageContext.getServletConfig();
          out = pageContext.getOut();
          _jspx_out = out;
    
          out.write("\r\n");
          out.write("\r\n");
    

在jsp中,只要是java代码,就会原封不动输出,是html代码,会被转换为java代码

out.write("<html>\r\n")

这样的格式,输出到前端

7.3 JSP基础语法

JSP作为java技术的一种应用,它拥有一些自己扩充的语法,java所有语法都支持

jsp表达式

<%--JSP表达式,作用:用来将程序的结果输出到客户端--%>
<%= 变量或表达式%>
<%= new java.util.Date()%>

jsp脚本片段

<%
int sum=0;
    for (int i = 0; i <=100 ; i++) {
        sum+=i;
    }
    out.println("<h1>sum="+sum+"<h1>");

%>

jsp脚本的再实现

<%--代码嵌入HTML元素--%>
<%
    for (int i = 0; i < 5; i++) {
%>
<h1>Hello world<%=i%></h1>
<%
    }
%>

jsp声明

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

jsp声明会被编译到jsp生成java的类中,而其他的会被生成到jspService方法中。

jsp的注释不会在客户端显示,而HTML的注释会显示

7.4 JSP指令

<%@include file=""%>//将两个页面合二为一
<jsp:include page=""></jsp:include>//拼接页面,本质还是两个

7.5 9大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application [ServletContext] 存东西
  • config [ServletConfig]
  • out
  • page 不用了解
  • exception
pageContext.setAttribute("name1","jyh1");//保存的数据只在一个页面中有效
request.setAttribute("name2","jyh2");//保存的数据只在一次请求汇总中有效,请求转发会携带这个数据
session.setAttribute("name3","jyh3");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
application.setAttribute("name4","jyh4");//保存的数据只在服务器中有效,从打开服务器到关闭服务器

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

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

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

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

都需要导入jar包jstl、standard

EL表达式:${}

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

JSP标签

<%--<jsp:include page=""></jsp:include>--%>
<jsp:forward page="jsptag2.jsp">
    <jsp:param name="name" value="jyh"/>
    <jsp:param name="age" value="20"/>
</jsp:forward>

JSTL表达式

JSTL标签库的使用就是为了弥补HTML标签的不足,它自定义许多标签,可供我们使用,标签的功能和java代码一样。

需要引入 <%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

核心标签

在这里插入图片描述

JSTL标签库使用步骤

  • 引入对应的taglib

  • 使用其中方法

  • 在Tomcat中也需要引入jstl的包(开启EL表达式:<%@page isELIgnored=“false” %>)

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@page isELIgnored="false" %>
    <%--引入核心标签库--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h4>if测试</h4>
    <hr>
    
    <form action="coreif.jsp" method="get">
    <%--
    EL表达式获取表单中的数据
    ${param.参数名}
    --%>
        <input type="text" name="username" value="${param.username}">
        <input type="submit" value="登录">
    
    </form>
    <%--判断如果提交的用户是管理员,则登录成功--%>
    <c:if test="${param.username=='admin'}" var="isAdmin">
        <c:out value="欢迎管理员"/>
    </c:if>
    <c:out value="${isAdmin}"/>
    </body>
    </html>
    
    <%@ page import="java.util.ArrayList" %>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@page isELIgnored="false" %>
    <%--引入核心标签库--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        ArrayList<String> people = new ArrayList<String>();
        people.add(0,"张三");
        people.add(1,"李四");
        people.add(2,"cathy");
        people.add(3,"Danneil");
        request.setAttribute("list",people);
    %>
    <%--
    var:每一次遍历出来的变量
    items:要遍历的对象
    step:步长
    --%>
    <c:forEach var="people" items="${list}">
        <c:out value="${people}"></c:out><br>
    </c:forEach>
    </body>
    </html>
    
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%@page isELIgnored="false" %>
    <%--引入核心标签库--%>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%--定义一个变量var 值为85--%>
    <c:set var="score" value="85"/>
    <c:choose>
        <c:when test="${score>=90}">成绩优秀</c:when>
        <c:when test="${score>=80}">成绩良好</c:when>
        <c:when test="${score>=60}">成绩及格</c:when>
        <c:when test="${score<60}">成绩不及格</c:when>
    
    </c:choose>
    </body>
    </html>
    
    

ed=“false” %>
<%–引入核心标签库–%>
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

Title <% ArrayList people = new ArrayList(); people.add(0,"张三"); people.add(1,"李四"); people.add(2,"cathy"); people.add(3,"Danneil"); request.setAttribute("list",people); %> <%-- var:每一次遍历出来的变量 items:要遍历的对象 step:步长 --%>

```jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<%--引入核心标签库--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个变量var 值为85--%>
<c:set var="score" value="85"/>
<c:choose>
    <c:when test="${score>=90}">成绩优秀</c:when>
    <c:when test="${score>=80}">成绩良好</c:when>
    <c:when test="${score>=60}">成绩及格</c:when>
    <c:when test="${score<60}">成绩不及格</c:when>

</c:choose>
</body>
</html>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容与0801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值