• [Servlet 1] JSP基础知识


    在之前学习过python web后并实践了一个项目后(目前我也在使用django + bootstrap在独立开发部署一个管理系统,有望可以开源放到gitee/github供大家学习参考与交流)

    下面一个阶段以Java EE为主,层层深入,从最简单的JSP+Servlet入手,到Spring boot框架,(不建议先学Spring,配置相当麻烦,比Servlet还麻烦很多,下面的博客提供了最全的配置Tomcat方法)再到Spring Cloud微服务等,同时接触Ruo-Yi来快速搭建。

    关于Servlet 配置(IDEA配置Tomcat服务器)可以看我这篇博客点击此处 本人在 2022年亲测依旧有效,本篇博客也成为收藏最多帮助最广的博客之一,希望对你也有所收获。
    在这里插入图片描述

    JSP语法基本就是换个体系的Java,所以Java基本功非常重要。当然这里浅谈以下如何运行.jsp文件。这里我用的是IDEA,注意此时你已经按照我上述博客安装了Tomcat与JDK了。一般只要在index.jsp改代码就行了,当然也可以在统一web目录下进行多个jsp书写,但是第一个跳转的永远是Index.jsp。原因在于web.xml配置与idea运行配置里面,关于其他运行配置将在后期详细补充。

    在这里插入图片描述

    环境介绍

    静态网页展示的内容是不变的,而动态网页会随身变化,内容大部分来自于数据库的变化。目前流行的动态网页技术是ASP php JSP.
    ASP:中间件,将web的请求转入到IIS解释器中,IIS将ASP上的Script脚本全部解析执行。缺点不能跨平台,只在windows平台上。
    PHP:流行的动态网页技术,一种html内嵌式的语言,融合了Java,C,Perl.很多网站采用PHP编写自身的网页。缺点是安装复杂。
    JSP:(java server pages)服务器端脚本,由html和嵌入式java组成。简单易用,完全面对对象。

    JSP简介

    首先客户端向web服务器提出请求,然后JSP负责将页面转化为Servlet,Servlet经过虚拟机编译成类文件,再把类文件加载到内存中执行,最后由服务器将处理结果返回给客户端。

    <body>
        <% 
           int count=0;
           for(int i=1;i<10;i++) {
        	count+=i;
        	}
        	out.print(" "+count);
           %>
    body>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

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

    可以在server.xml更改服务端口和改变web默认的访问目录。
    1.修改端口号

    # server.xml
    <Connector port='8080'>Connector>
    
    • 1
    • 2

    2.修改web默认的访问目录

    <Host name="localhost" appBase= "webapps"
          unpackWARs="true" autoDeploy="true"
          xmlValidation="false" xmlNamespaceAware="false">Host>
    
    
    # 修改appBase中的文件夹地址
    appBase = "D:\test"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.建立自身的web目录

    应用部署再Tomcat服务器的默认webapps目录,也可以部署自己创建的目录下。方法:首先创建目录D:\test,其次配置web目录,在server.xml末尾 加语句

    <Context path="test" docBase ="D:\test" debug="0" reloadable="true">Context>
    
    • 1

    JSP基础语法

    注释:一般和java混用

    <%-- 注释内容 --%> 
    
    • 1

    声明:和java一样.在其页面可以被调用和使用

    <%!
        int x,y=60;
        String name = "Joah";
        int chengji(int m,int n) {
        	return m*n;
        }
     %> 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    JSP表达式:将动态信息显示在页面中

    <%=new Date()%>
    
    • 1

    page指令:设置JSP页面的属性和相关功能,基本语法如下:language 默认是java, import需要导入的包,pageEncoding 用于设置页面的编码

    <%@ page attribute1="value1" [...attribute n="value n"]%>
    
    • 1

    include指令:在JSP页面生成Servlet 引入需要包含的页文件,可以是html文件或者JSP文件。在编译时导入

    <%@ include file="url"%>
    
    • 1

    taglib指令:自定义新的标签在页面执行,语法如下:JSTL标签

    <%@taglib uri="tagliburl" prefix="tagPre" %>
    
    例如:
    <%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>
    <c:forEach begin="1" end="10" var="num">
    	<c:out value="${num}">c:out>
    c:forEach>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    include动作:和指令十分相似,引入文件到目标页面,被访问时导入的。效率稍慢

    <jsp:include page="rel url" flush="true"/>
    page需要包含的文件路径,flush用于指定输出缓存是否转移到被导入文件中
    
    • 1
    • 2

    forward动作:转发请求到另一个页面,请求过程中会连同请求的参数数据一起被转发到目标页面中。

    <jsp:forward page="rel url" />
    page="<%=url %>"
    
    • 1
    • 2

    param动作:传递参数信息,和上述两个结合使用。格式要统一,否则会出现乱码问题

    <jsp:param name="参数名称" value="李四"/>
    
    main.jsp:
    
    
    <jsp:include page="sub.jsp">
    	<jsp:param value="Joan" name="username"/>
    jsp:include>
    
    sub.jsp:
    <%
       String username = request.getParameter("username")
       %>
    
    <td>用户名: <%=uername%>td>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    JSP内置对象

    含义是可以直接在JSP页面使用的对象,使用前不需要声明它们。

    request对象

    方法

    每访问一个页面,就会产生一个HTTP请求。包含了参数值或者信息,可以获取客户端和服务端的信息,如IP,传递参数等。

    方法方法说明
    getParameter()取得请求中指定的参数值,返回String
    getParameterNames()获取参数名称,返回枚举类型
    getMethod()获取客户提交信息的方式。即POST,GET
    getRemoteAddr()获取客户的IP地址
    getHeader()获取HTTPt头文件的指定值

    接收请求参数

    获取网页请求参数

    浏览器地址栏输入 ?name=jacin&city=shanghai
    在url参数传递时候,页面使用?连接请求参数。

    index.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
    
    
      Title
    
    
    <%
      String name = request.getParameter("name");
      String city = request.getParameter("city");
      if(name != null && city != null) {
    %>
    

    Welcome <%=name%>,你的城市是<%=city%>

    <% }else { %>

    欢迎访问

    <% } %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    一般采取表单提交的方式传递参数。在form中,两个重要的属性:action 和method (post)。

    getPa.jsp
    <%@ page contentType="text/html;charset=UTF-8" language="java" import="java.util.*" %>
    
    
        Title
    
    
        
    姓名
    城市
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    请求中文乱码的处理
    可以在接收页面(即上述的index.jsp)添加 request.setCharacterEncoding(“utd-8”);

    或者:
    在取得参数后,通过转码方式转为合适的字符集
    String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"utf-8")
    
    • 1
    • 2
    • 3

    可以编写一个Servlet过滤器来解决中文乱码问题,并可以通过配置解决所有的请求处理字符集问题(推荐)
    获取请求的头部信息

    除了有getHeaders(),有以下方法:String getHeader(String name) ,int getIntHeader(String name)获取整型的表头信息

    
      <%
        Enumeration e = request.getHeaderNames();
        while(e.hasMoreElements()) {
          String name = e.nextElement();
          String value = request.getHeader(name);
          if(value == null || "".equals(value)) {
            value = "空字符";
          }
         %>
            

    表头名称: <%=name%>  对应: <%=value%>

    <% } %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    response对象

    当用户访问一个页面时候,会产生一个HTTP请求,服务器做出响应时调用的是reponse包,实现的是javax.servlet.http.HttpServletResponse。

    方法说明
    addHeader(String name,String value)向页面添加头和对应的值
    sendRedirect(String url)页面重定向
    setContentType(String type)设定页面的MIME类型和字符集

    设置头信息

    包括设置返回的MIME类型、返回的字符集、页面中的meta等信息。有两种方法设置

    reponse.setContentType(String type):type值为 "text/html;charset=utf-8"
    page指令: <%@ page contentType="text/html;charset=utf-8 language="java" %>
    利用page指令设置字符集相对简单。
    
    • 1
    • 2
    • 3

    设置meta信息是指在html页面存在head之间的信息。

    
    x:cache-control,y:no-cache:请求和响应遵循的缓存机制策略
    x: pragma y:no-cache 设定禁止浏览器从本地缓存中调取页面内容
    
    # setMeta.jsp:
    实际开发中直接在html写定,不是在响应中设定
    
        <%
        	response.setHeader("refresh","1")
             response.setHeader("keywords/description/cache-control",words)
        %>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    设置页面重定向
    重定向指一个页面在收到一个访问请求后,根据请求的url重新跳转到其他页面。

    <%
    	response.sendRedirect("sendPage.jsp")
    %>
    
    
    • 1
    • 2
    • 3
    • 4

    session对象

    web开发中,session对象占据极其重要的位置。判断是否为同一用户,用来记录客户的连接信息等。HTTP协议是一种无状态(不保存连接状态)的协议.因此,如果浏览器没有关闭又有请求了,那么网站可以识别出来。

    名称说明
    会话打开到关闭浏览器过程称为一个会话
    session对象生命周期访问的这段时间
    session,cookie一一对象,JSP会将创建的session对象存在Cookie中

    获取session对象ID可以判断会话是否为同一会话。
    假设有3个页面,ex3_2.jsp ex3_3.jsp ex3_4.jsp (2和3在一个应用下)
    一个web应用的session对象的ID值是唯一的,病情两个应用的参数利用session对象是获取不到值的.

    # ex3_2.jsp
    
        <%
        	String sessionID =session.getID();
        	session.setAttribute("name","john");
             String author = (String) session.getAttribute("author");
        %>
        
    来到4jsp
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    用户登录信息的保存

    在这里插入图片描述

    # login.jsp
    
        
    用户名称:
    密码:
    # validate.jsp <%! //声明一个用户集合,模拟数据库取出用户集 Map map=new HaspMap(); bool flag= false; map.put("jon","12345"); //添加样例数据 %> <%! //声明验证方法 boolean validate(String username,String password) { String passwd = map.get(username); if(passwd !=null && passwd.equals(password)) { return true; }else { return false; } } %> <% //获得页面提交的用户名和密码 String username = request.getParameter("username"); String password = request.getParameter("password"); if(username==null || username=="" || password==null || password =="") { response.sendRedirect("login.jsp"); } flag = validate(username.password); if(flag) { //保存session对象 session.setAttribute("username",username); session.setAttribute("password",password); response.sendRedirect("class.jsp"); } %> # logout.jsp: <% String name = (String)session.getAttribute("name"); session.removeAttribute("john"); session.invalidate(); reponse.sendRedirect("login.jsp") %> 退出操作利用简单的invalidate实现的,实际开发中结合Struts框架
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    application 对象

    实现的接口javax.servlet.ServletContext.服务器运行时候有效,关闭则消失了。

    方法说明
    getAttribute(String name)存放在application中关键字含name
    getServletInfo()获取Servlet当前版本信息
    getRealPath(String path)获取指定文件的实际路径

    获取指定页面的路径

    # application.jsp 用于指定页面输出所在实际路径和相对路径
    <%=application.getRealPath("application.jsp") %>
    <%=application.getResource("application.jsp") %>
    <%=application.getContextPath("application.jsp") %>
    
    • 1
    • 2
    • 3
    • 4

    设计一个网站计数器

    用于保存访问网站的人数。

    <%
    	Integer count = (Integer) application.getAttribute("count");
    	if(count == null) {
            count=1;
        }else {
            count++;
        }
    	application.setAttribute("count",count);
    %>
    
    
    application 对象在web应用时一直存在于服务器,因此保存这种相对全局变量相对占用资源,因此不推荐使用。实际开发,让对象存在于必要的时间段,否则加剧时会造成不足。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    out对象

    继承javax.servlet.jsp.JspWriter 一个输出流对象。常用的方法就是输出内容到Html

    方法说明
    append(char c)将字符添加到输出流
    clear()清空缓存
    flush()网页流的刷新
    println()将内容直接打印
    write()只输出与字符相关的数据
    
        <%
        	out.println("")
        %>
    
    调用clear之前不要调用flush方法,否则抛IO异常。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    page对象

    对象实质是java.lang.Object对象,代表转译后的Servlet。page对象是指当前的JSP页面本身,在实际开发中不常用。

    方法说明
    getClass()返回被转译的Servlet类
    hashCode()返回被转译的Servlet类的哈希代码
    toString()被转译的Servlet类转换字符串
    
        <%
        	int code = page.hashCode(); //获取page对象中的值
        	String str = page.toString();
        	out.println(code);
        	out.println(str); 
        %>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    config对象

    实现了javax.servlet.ServletConfig 接口,一般用于在页面初始化传递参数。

    方法说明
    getServletName()获得Servlet名字
    equals(Obj)比较此时的对象是否和指定的对象相等
    toString()获得此对象的值

    在web-inf文件的web.XML

    <web-app version="4.0">web-file-file>
    
    <servlet>
    	<servlet-name>
        jspconfigdemo
        servlet-name>
        <jsp-file>
        /config.jsp
        jsp-file>
        <init-param>
        <param-name>urlparam-name>
         <param-value>baidu.comparam-value>
        init-param>
    servlet>
    
    <servlet-mapping>
    	<serlet-name>
        	jspconfigdemo
        serlet-name>
        <url-pattern>/config.jspurl-pattern>
    servlet-mapping>
    
    web-app>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    配置Servlet,包括初始化参数。

    # config.jsp
    
        <%
        	String url = config.getInitParameter("url");
        	String str = config.toString();
        	out.config(url)
    	%>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    一般而言很少使用config对象,因为JSP实质是Servlet.

    以上就是JSP全部内容了,希望有所帮助。

  • 相关阅读:
    鸿蒙HarmonyOS实战-ArkUI组件(Image)
    聊一聊适配器模式
    点餐小程序实战教程02用户注册
    Spring Data Envers:使用实体修订进行审计
    浙江2022农民丰收节 国稻种芯:主场东阳活动农民群众联欢
    Qt ListItem添加右键菜单
    Attention Is All You Need--论文笔记
    unity工具类篇 时间间隔帮助类(天、时、分、秒) 下篇
    梳理拯救烂怂代码?我是这么做的
    [wp][RCTF2015]EasySQL
  • 原文地址:https://blog.csdn.net/QAZJOU/article/details/126431931