深入理解JSP

《深入理解 JSP:从基础到进阶》 HTML:用于创建静态网页,内容固定不变。JSP:用于创建动态网页,内容可以根据数据变化而更新,支持嵌入 Java 代码和 HTML 代码。2.JSP为什么会出现1.servlet展示信息的不方便,引入了JSP。2.JSP本质上也是一个servlet!!!!!!3.JSP就是在HTML页面中嵌入了java代码。 阅读详情

第一章 JSP

1、概述

1.1 JSP引入

在前面的登录案例中,登录失败后为了能够响应登录的错误信息。我特意创建了一个LoginErrorServlet用来动态地拼接错误信息。

【代码如下】

  1. LoginErrorServlet:登录失败,手动拼接login.html页面,并将错误信息动态地添加进去。
<span style="background-color:#fafafa"><span style="color:#222222"><code>arduino复制代码       <span style="color:#999999">//3.给浏览器生成响应信息</span>
        <span style="color:#114ba6">boolean</span> result = service.login(username,password);
        <span style="color:#114ba6">String</span> msg = result ? <span style="color:#00753b">"用户登陆成功"</span> : <span style="color:#00753b">"用户登陆失败"</span>;
        request.setAttribute(<span style="color:#00753b">"msg"</span>,msg);
        <span style="color:#114ba6">if</span> (result){
            <span style="color:#999999">//登陆成功</span>
            response.sendRedirect(<span style="color:#00753b">"/success.html"</span>);
        }<span style="color:#114ba6">else</span> {
            <span style="color:#999999">//登陆失败</span>
            <span style="color:#999999">//转发到处理错误的servlet中</span>
          request.getRequestDispatcher(<span style="color:#00753b">"/loginErrorServlet"</span>).forward(request,response);
        }
</code></span></span>

2. LoginErrorServlet:手动拼接html页面,动态展示登录错误信息。

<span style="background-color:#fafafa"><span style="color:#222222"><code>scss复制代码@Override
    <span style="color:#114ba6">protected</span> void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        <span style="color:#999999">//响应给用户</span>
        response.setContentType(<span style="color:#00753b">"text/html;charset=utf-8"</span>);
        <span style="color:#999999">//接收错误的信息</span>
        String msg = (String) request.getAttribute(<span style="color:#00753b">"msg"</span>);
        <span style="color:#999999">//获取输出流</span>
        PrintWriter writer = response.getWriter();
         <span style="color:#999999">//拼接登录的html页面</span>
        response.getWriter().<span style="color:#114ba6">print</span>(<span style="color:#00753b">""</span>);
        response.getWriter().<span style="color:#114ba6">print</span>(<span style="color:#00753b">""</span>);
        response.getWriter().<span style="color:#114ba6">print</span>(<span style="color:#00753b">"</span></code></span></span>

"); response.getWriter().print(" "+msg+"
"); response.getWriter().print("用户名:
"); response.getWriter().print("密码:
"); response.getWriter().print(""); response.getWriter().print("

"); response.getWriter().print(""); response.getWriter().print(""); }

说明:上述虽然能够达到我的需求。但是他有以下两个缺点:

  1. 拼接麻烦开发效率低;
  2. 阅读性差,代码难以维护;

问题:思考既然以前在servlet有上述缺点,为什么还要使用拼接呢?

因为如果我们想在html页面显示错误的信息,我们只能采用这种方式,html页面不能够书写java代码。而我们既不采用上述拼接标签的方式,还想实现简单的效果。我们可以使用jsp技术,在jsp中可以书写java代码同时还可以书写html标签。这样 就能够使用jsp技术在客户端和服务端直接进行数据交互了。

1.2 JSP是什么

JSP全名为Java Server Pages,中文名叫java服务器页面,其本质是一个Servlet ,它是由Sun 公司倡导、许多公司参与一起建立的一种动态网页 技术标准。其实就是一个既能书写Servlet代码又能书写HTML代码的文件。

1.3 创建JSP文件

<span style="background-color:#fafafa"><span style="color:#222222"><code>sql复制代码在web目录下,新建一个jsp文件,点击鼠标右键New <span style="color:#999999">--- JSP---给这个文件取个名字。</span>
</code></span></span>

【图1 创建JSP】

文件内容如下:

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    





</code></span></span>

1.4 在JSP中书写代码

jsp中既可以书写java代码,同时还可以书写html标签。我们完成练习如何在jsp页面中书写java代码。

【需求】

  1. 在jsp页面上获取当前日期,并将其格式化成字符串"yyyy-MM-dd HH:mm:ss";
  2. 将这个字符串展示在浏览器上;

说明:

1)jsp中的注释:<%--注释内容--%>,添加注释的快捷键是:ctrl+/;

2)在jsp中书写代码有三种方式,我们这里先介绍一种,格式:

<%java代码%>

【参考代码】demo01.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>arduino复制代码<%@ page import=<span style="color:#00753b">'java.util.Date'</span>>
<%@ page import=<span style="color:#00753b">'java.text.SimpleDateFormat'</span>><%-- created by intellij idea. <span style="color:#114ba6">date:</span> <span style="color:#a82e2e">2018</span>-<span style="color:#a82e2e">01</span>-<span style="color:#a82e2e">09</span> <span style="color:#114ba6">time:</span> <span style="color:#a82e2e">19</span>:<span style="color:#a82e2e">15</span> to change this template use file settings file templates. -->
<%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>>


    


    <%-- jsp <span style="color:#a82e2e">1</span>. jspyyyy-mm-dd <span style="color:#114ba6">hh:</span><span style="color:#114ba6">mm:</span>ss <span style="color:#a82e2e">2</span>. -->
    <% date d=<span style="color:#00753b">'new'</span> date simpledateformat sdf=<span style="color:#00753b">'new'</span> simpledateformatyyyy-mm-dd <span style="color:#114ba6">hh:</span><span style="color:#114ba6">mm:</span>ss d string s_date=<span style="color:#00753b">'sdf.format(d);'</span> system.out.printlns_date=<span style="color:#00753b">'+ s_date);         //将这个字符串展示在浏览器上         response.getWriter().print(s_date);     %>   </span></code></span></span>

在浏览器看到 format格式的日期:

【控制台输出】

<span style="background-color:#fafafa"><span style="color:#222222"><code><span style="color:#00753b">ini复制代码s_date</span> <span style="color:#00753b">=</span> <span style="color:#a82e2e">2018</span><span style="color:#a82e2e">-01</span><span style="color:#a82e2e">-09</span> <span style="color:#a82e2e">19</span><span style="color:#00753b">:28:22</span>
</code></span></span>

2、JSP的运行原理

通过上面的jsp初体验, 我们看到jsp中既可以编写java代码也可以直接编写html代码,相对servlet更加方便.并且我们通过浏览器访问到的jsp页面,最后在浏览器中看到了响应到浏览器中的结果。那么整个过程的执行流程是怎样的呢,我们可以参考如下图:

通过上面的执行流程,我们可以找到jsp生成的.java源文件,这样就可以知道jsp的真正原理,同时可以看下jsp为什么是servlet。

如何查看生成的.java源文件呢?

我们可以到tomcat中查看一下上面案例中的jsp页面是怎么样的一种存在。IDEA借助tomcat发布web项目的机制:动态发布(为每一个web项目创建一个单独的发布文件)。我们可以通过tomcat其中日志中的CATALINA_BASE路径找到我们当前这个JSP页面在tomcat中的位置:

【图1 IDEA发布项目的路径】

找到这个目录后,会看到以下3个文件夹:

【图2 文件目录】

我们打开C:\Users\admin.IntelliJIdea2017.3\system\tomcat\Tomcat_8_5_311_day05目录发现有两个文件:

【图3 JSP被翻译后的代码】

打开demo01_jsp.java文件后,代码如下所示:

我们可以看到当前的jsp文件被翻译成了一个类,这个类继承HttpJspBase类,那么这个HttpJspBase类又是什么?

注意:jsp的翻译由服务器完成,HttpJspBase类一定也是tomcat服务器的内容,所以我们需要找到
org.apache.jasper.runtime.HttpJspBase这个类,这个类可以到tomcat的安装目录下的lib文件夹下找到jasper.jar,将其解压,找如下目录:org\apache\jasper\runtime,找到HttpJspBase.class。

使用反编译工具打开,如下所示:

通过观察源码,根据我们所学习的继承关系,我们发现JSP其实底层就是一个servlet。通过观察源码,我们发现我们刚刚编写的所有代码都在该Servlet里面的service方法内部。

<span style="background-color:#fafafa"><span style="color:#222222"><code>swift复制代码<span style="color:#114ba6">public</span> <span style="color:#114ba6">final</span> <span style="color:#114ba6">class</span> <span style="color:#a82e2e">demo01_jsp</span> <span style="color:#a82e2e">extends</span> <span style="color:#a82e2e">org</span>.<span style="color:#a82e2e">apache</span>.<span style="color:#a82e2e">jasper</span>.<span style="color:#a82e2e">runtime</span>.<span style="color:#a82e2e">HttpJspBase</span> {
     
     <span style="color:#114ba6">public</span> void _jspService(<span style="color:#114ba6">final</span> javax.servlet.http.HttpServletRequest request, <span style="color:#114ba6">final</span> javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {
    <span style="color:#114ba6">try</span> {
      response.setContentType(<span style="color:#00753b">"text/html;charset=UTF-8"</span>);
      pageContext = _jspxFactory.getPageContext(<span style="color:#114ba6">this</span>, request, response,
                <span style="color:#8a7304">null</span>, <span style="color:#8a7304">true</span>, <span style="color:#a82e2e">8192</span>, <span style="color:#8a7304">true</span>);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      <span style="color:#114ba6">out</span> = pageContext.getOut();
      _jspx_out = <span style="color:#114ba6">out</span>;

      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">'\r'</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">'\n'</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"    </span><span style="color:#00753b">\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"    "</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"    "</span>);

        <span style="color:#999999">//获取当前系统时间</span>
        Date d = new Date();
        <span style="color:#999999">//创建日期格式化解析器对象</span>
        SimpleDateFormat sdf = new SimpleDateFormat(<span style="color:#00753b">"yyyy-MM-dd HH:mm:ss"</span>);
        <span style="color:#999999">//使用日期格式化解析器对象调用方法格式化日期对象d</span>
        String s_date = sdf.format(d);
        <span style="color:#999999">//控制台输出</span>
        System.<span style="color:#114ba6">out</span>.println(<span style="color:#00753b">"s_date = "</span> + s_date);
        <span style="color:#999999">//将这个字符串展示在浏览器上</span>
        response.getWriter().print(s_date);
    
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
      <span style="color:#114ba6">out</span>.write(<span style="color:#00753b">"\r\n"</span>);
    } <span style="color:#114ba6">catch</span> (java.lang.Throwable t) {
      。。。。
  }
}
</code></span></span>

总结:

1.<%>中书写的代码被直接解析成java代码;

2.jsp之所以可以编写html代码,其实本质上也是类似我们使用Servlet直接输出的。也就是说底层还是像我们之前做法一样进行标签拼接。html部分都被out.write("")方法以字符串的形式拼接,然后响应给浏览器;

3.在这个java文件中有个_jspService,这个方法有两个参数request,response;

4.由于我们自己编写的代码全部都落入到了service方法内部一开始就已经声明了request,response,session,application(ServletContext)等对象了,这些对象成为之jsp内置对象。

3、JSP中书写java代码的三种方式

在JSP页面的body标签中,可以直接书写html代码和JS代码。但是,如果在JSP页面中书写java代码。必须遵循固定的格式,才能够生效;JSP页面中书写java代码有三种方式:1.脚本片段;2.脚本声明;3.脚本表达式;

方式一:脚本片段

脚本片段指的是一段java代码。书写格式:<% java>

【示例】 demo02.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


<span style="color:#114ba6"><% java response.getwriter.printlnhello jsp></span>



</code></span></span>

【被翻译后的源码】

<span style="background-color:#fafafa"><span style="color:#222222"><code>swift复制代码 out<span style="color:#a82e2e">.write</span>(<span style="color:#00753b">"\r\n"</span>);
 out<span style="color:#a82e2e">.write</span>(<span style="color:#00753b">"    "</span>);
 response<span style="color:#a82e2e">.getWriter</span>()<span style="color:#a82e2e">.println</span>(<span style="color:#00753b">"hello jsp"</span>);
 out<span style="color:#a82e2e">.write</span>(<span style="color:#00753b">"\r\n"</span>);
</code></span></span>

【页面结果】:

方式二:脚本声明

<span style="background-color:#fafafa"><span style="color:#222222"><code>erlang复制代码脚本片段虽然可以嵌入java代码,但是如果,我们要给当前的jsp中定义一些成员方法或者成员变量,就需要一个新的技术——脚本声明.
</code></span></span>

说明:通过查看jsp的源代码我们发现,脚本片段的代码都会存在service方法中,而方法中是不可以定义一个方法的。

脚本声明的格式:<%! java>

【示例一】声明成员变量 demo03.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>>


    


<%! <span style="color:#114ba6">int</span> num=<span style="color:#00753b">'10;'</span> <span style="color:#114ba6">public</span> <span style="color:#114ba6">void</span> method>



</code></span></span>

【被翻译后的代码】成员变量

方式三:脚本表达式

虽然脚本声明和脚本片段已经可以书写Java代码了,但是如果我们要使用java代码向页面输出一些内容,还是需要 使用原来的response对象,比较繁琐,因此,我们需要一个更加简便的方式,可以代替response向页面输出内容 ——这个就是脚本表达式。

脚本表达式的格式:<%=> 等价于:out.print( 向浏览器输出的内容)

【示例】在页面输出信息

<span style="background-color:#fafafa"><span style="color:#222222"><code>bash复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


<span style="color:#114ba6"><%="我爱摸鱼"%></span>
<span style="color:#114ba6"><%="上海程序员摸鱼"%></span>
<span style="color:#114ba6"><% response.getwriter.printresponse></span>



</code></span></span>

注意:

上面代码中,我们书写代码的顺序是先:

<span style="background-color:#fafafa"><span style="color:#222222"><code><span style="color:#114ba6">arduino</span>复制代码<%=<span style="color:#00753b">"我爱摸鱼"</span>%>
<span style="color:#a82e2e"><%="上海程序员摸鱼"%></span>
</code></span></span>

再:

<span style="background-color:#fafafa"><span style="color:#222222"><code>vbscript复制代码response<span style="color:#a82e2e">.getWriter</span>()<span style="color:#a82e2e">.print</span>(<span style="color:#00753b">"response"</span>);
</code></span></span>

可是浏览器查看数据的结果是

<span style="background-color:#fafafa"><span style="color:#222222"><code>vbscript复制代码response 我爱摸鱼 上海程序员摸鱼
</code></span></span>

原因:response.getWriter()获取的输出流是:PrintWriter。而脚本表达式<%=%> 等价于:out.print( 向浏览器输出的内容).并且这种方式获取的输出流是:JspWriter。其实导致上述输出结果前后顺序就是PrintWriter和JspWriter。

JspWriter:将输出的内容先放到jsp内置的缓冲区中,然后再刷新输出。

PrintWriter:是不使用jsp内置的缓冲区,直接将内容写到网页中。

总结:

1.不要同时使用脚本表达式和response同时往页面输出信息,会出现顺序不一致。现象:response会出现在最前面。使用一种输出即可。

2.脚本表达式<%= str> :在页面输出内容,在service方法中起作用;

3.脚本片段<%> :在service方法中,原样输出的代码片段;属于局部为,放在_jspService方法中

4.脚本声明:<%! string str='程序员'> :定义成员变量;

4、JSP的三大指令

4.1 指令概述

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出效果,而只是告诉引擎如何处理JSP页面中的其余部分。

指令用来声明JSP页面的一些属性,比如编码方式,文档类型。我们在servlet中也会声明我们使用的编码方式和响应的文档类型的,而JSP就是用指令来声明的。

【1】JSP页面的3大指令

<span style="background-color:#fafafa"><span style="color:#222222"><code>css复制代码a)  page:页面
<%@page contenttype=<span style="color:#00753b">'text/html;charset=utf-8'</span>>
    说明:声明jsp页面的编码方式
b)  taglib:引入标签库
c)  <span style="color:#114ba6">include</span>:包含
</code></span></span>

【2】指令的格式

<span style="background-color:#fafafa"><span style="color:#222222"><code>swift复制代码<span style="color:#114ba6"><%@指令名></span>
</code></span></span>

4.2 taglib指令

【作用】

<span style="background-color:#fafafa"><span style="color:#222222"><code>复制代码用于在JSP页面中导入JSTL标签库;
</code></span></span>

【格式】

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<%@taglib <span style="color:#114ba6">prefix</span>='<span style="color:#114ba6">c</span>' uri='http:<span style="color:#999999">//java.sun.com/jsp/jstl/core'></span>
说明:表示引入外部的jstl标签库的。
<span style="color:#114ba6">prefix</span>=<span style="color:#00753b">"c"</span> 表示前缀
uri=<span style="color:#00753b">"http://java.sun.com/jsp/jstl/core"</span> 表示jstl标签库的地址
</code></span></span>

4.3 include指令

【作用】

<span style="background-color:#fafafa"><span style="color:#222222"><code>复制代码在一个JSP页面中静态包含另外一个JSP页面;
</code></span></span>

【格式】

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<%@include file=<span style="color:#00753b">'URL'</span>> 指定要导入页面的地址
</code></span></span>

【使用示例】

需求:课后的原型中的页面放到web文件夹下面。然后打开主页index.jsp.在主页中引入header.jsp页面。

<span style="background-color:#fafafa"><span style="color:#222222"><code>xml复制代码
</code></span></span>

【效果】

小结

三大指令是什么?分别的作用是?

  1. page:设置网页上一些属性
  2. taglib:导入标签库
  3. include:包含另一个JSP页面

5、page指令

5.1、page指令概述

【1】page指令的作用

page是jsp中必须使用的一个指令,用于设置JSP上各种页面的属性,告诉tomcat如何将一个JSP翻译成Servlet

【2】语法格式

<span style="background-color:#fafafa"><span style="color:#222222"><code>css复制代码<%<span style="color:#114ba6">@page</span>>
</code></span></span>

可以放在JSP中任何位置,一般建议放在页面的最顶部

5.2、page指令的属性

【1】导包相关属性:

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码language=<span style="color:#00753b">"java"</span> 当前页面使用的语言,不写默认是java
<span style="color:#114ba6">import</span>=<span style="color:#00753b">"java.util.*"</span> 导入java.util下所有类,导包
</code></span></span>

方式一: 每个page指令导入一个类

<span style="background-color:#fafafa"><span style="color:#222222"><code>less复制代码<%@page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.text.SimpleDateFormat'</span>>
<%@page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.util.Date'</span>>
</code></span></span>

方式二: 一个page指令的import属性导入所有的包,包之间使用逗号分隔

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<%@page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.util.Date,java.text.SimpleDateFormat'</span>>
</code></span></span>

作用:相当于导包

【代码演示】

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<%--<%@ page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.util.Date'</span>>
<%@ page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.text.SimpleDateFormat'</span>>
<%@ page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.util.ArrayList'</span>>--%>
<%@ page <span style="color:#114ba6">import</span>=<span style="color:#00753b">'java.util.*,java.text.SimpleDateFormat'</span>>

<%-- created by intellij idea. date: <span style="color:#a82e2e">2018</span><span style="color:#a82e2e">-10</span><span style="color:#a82e2e">-10</span> time: <span style="color:#a82e2e">14</span>:<span style="color:#a82e2e">59</span> to change <span style="color:#114ba6">this</span> template use file settings file templates. -->
<%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>>


    


<%
    <span style="color:#999999">//创建日期对象</span>
    <span style="color:#114ba6">Date</span> date = <span style="color:#114ba6">new</span> <span style="color:#114ba6">Date</span>();
    SimpleDateFormat simpleDateFormat = <span style="color:#114ba6">new</span> SimpleDateFormat();
    ArrayList list = <span style="color:#114ba6">new</span> ArrayList<>();
%>



</code></span></span>

【2】与编码相关属性:

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>
</code></span></span>

【作用】设置响应编码

<span style="background-color:#fafafa"><span style="color:#222222"><code>vbscript复制代码response<span style="color:#a82e2e">.setContentType</span>(<span style="color:#00753b">"text/html;charset=UTF-8"</span>);
</code></span></span>

【3】与错误相关

相关属性:

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<span style="color:#a82e2e">1</span>、errorPage=<span style="color:#00753b">"错误页面的URL"</span>:
    用于指定如果当前页面出错,转发到哪个页面去:<%@ page language=<span style="color:#00753b">'java'</span> errorpage=<span style="color:#00753b">'error.jsp'</span>>

<span style="color:#a82e2e">2</span>、isErrorPage=<span style="color:#00753b">"false"</span>:默认是<span style="color:#114ba6">false</span>,指定<span style="color:#114ba6">true</span>表示是错误页面
    当前这个页面是否是一个错误页面,错误页面可以多使用一个内置对象。<span style="color:#114ba6">exception</span>:<%@ page iserrorpage=<span style="color:#00753b">'true'</span>>
</code></span></span>

错误页面跳转的3种设置:

1、通过page指令的errorPage属性指定:如果页面出错,转发到error.jsp这个页面

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<span style="color:#114ba6"><%@ page errorpage=<span style="color:#00753b">'error.jsp'</span>></span>
</code></span></span>

代码演示:

<span style="background-color:#fafafa"><span style="color:#222222"><code>typescript复制代码<span style="color:#114ba6"><%--跳转到错误页面--%></span>
<span style="color:#114ba6"><%@page errorpage=<span style="color:#00753b">'../error.jsp'</span>></span>

<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


<span style="color:#114ba6"><% int i=<span style="color:#00753b">'1'</span> 0></span>
    hello world


</code></span></span>
<span style="background-color:#fafafa"><span style="color:#222222"><code>typescript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>
<span style="color:#114ba6"><%--声明是错误页面--%></span>
<span style="color:#114ba6"><%@page iserrorpage=<span style="color:#00753b">'true'</span>></span>


    


    </code></span></span>

错误页面

<%=exception.getmessage()%>

页面效果:

2、通过web.xml文件指定错误码:响应状态码为404则跳转到404.jsp页面

如果不指定,那么按照以前报错方式,会出现如下错误页面:

我们可以在web.xml进行配置跳转到更加好看一些的页面。

<span style="background-color:#fafafa"><span style="color:#222222"><code><span style="color:#00753b">xml复制代码</span>

    
    <span style="color:#a82e2e">404</span>
    
    <span style="color:#00753b">/404.jsp</span>

</code></span></span>

404.jsp页面代码:

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    <img data-cke-saved-src="https://www.toutiao.com/404.jpg" src="https://www.toutiao.com/404.jpg" />


</code></span></span>

3、通过web.xml文件指定错误类型:发生空指针,则跳转到null.jsp页面

<span style="background-color:#fafafa"><span style="color:#222222"><code>xml复制代码

    java.lang.NullPointerException
    /<span style="color:#8a7304">null</span>.jsp


</code></span></span>

demo02.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    <span style="color:#114ba6"><% string s=<span style="color:#00753b">'null;'</span> s.length></span>


</code></span></span>

报空指针异常后的页面:null.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    </code></span></span>

发生空指针异常了

浏览器效果:

page指令小结:

属性名

作用

language="java"

指定JSP页面使用语言

**import="{package.class

package.*}"**

导入包: 1. 每个import包入一个包 2. 一个import导入多个包,使用逗号分隔

errorPage="relative_url"

当前页面出错,转发到哪个错误页面

**isErrorPage="true

false"**

当前是否是一个错误页面

contentType="mimeType [ ;charset=characterSet ]"

指定页面类型和编码,不指定会有乱码

**isELIgnored="true

false"**

是否忽略EL表达式,true表示EL不起作用

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span> iselignored=<span style="color:#00753b">'true'</span>>


    


<span style="color:#d96322">${3*5}</span>


</code></span></span>

6、JSP常用动作标签

6.1、什么是动作标签

JSP动作标签利用XML语法格式的标记来控制Servlet引擎的行为 。利用JSP动作标签可以动态包含其他jsp页面、把用户跳转到另外的页面、为Java插件生成HTML代码。

6.2、常用动作标签

JSP页面动作标签很多,常用的主要有以下3种:

<span style="background-color:#fafafa"><span style="color:#222222"><code>makefile复制代码:动态包含
:跳转 类似之前学习的转发技术
:参数设置
</code></span></span>

6.3、常用标签使用

【1】

【作用】

<span style="background-color:#fafafa"><span style="color:#222222"><code>复制代码用于一个JSP页面动态包含另一个JSP页面
</code></span></span>

【语法】

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码 URL是被包含的JSP页面
</code></span></span>

【使用示例】

a.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    </code></span></span>

我是A页面

<%int m1='10;'> <%@include file='b.jsp'> <%-- --%>

b.jsp

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    </code></span></span>

我是B页面

<%int m='20;'>

【动态包含和静态包含】

静态包含include指令

动态包含include动作

语法格式

<%@include file='URL'>

包含的方式

静态包含包含的是页面的内容。如果A包含B,则先将B的页面内容复制到A页面中,再运行A页面。 B页面中不能出现与A页面同名的变量

动态包含包含的是页面的执行结果,如果A包含B,则先将B执行,再将B执行的结果包含到A页面中,执行A页面。 B页面中可以出现与A页面中同名的变量

生成Servlet个数

只能生成了一个Servlet

生成了两个Servlet

说明:

如果只是引入jsp,不需要改变,那么使用静态引入。如果引入的jsp页面是变化的,那么使用动态引入。

【2】

用于页面的转发,与
request.getRequestDispatcher("/URL").foward(request,response);功能一样的

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码 转发
</code></span></span>

【3】

用于给和提供参数

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码
</code></span></span>

forward和param动作

目标

  1. forward作用
  2. param的功能

forward

  1. 功能:用于转发,相当于request.getRequestDispatcher("/URL").forward(request, response)
  2. 语法
<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码
</code></span></span>

param

  1. 功能:给forward和include提供参数名和值
  2. 语法:做为子标签存在
  3. 需求:在c.jsp页面中使用转发标签forward转发到d.jsp页面。
  4. c.jsp页面
<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<%-- created <span style="color:#114ba6">by</span> intellij idea. date: <span style="color:#a82e2e">2018</span>-<span style="color:#a82e2e">10</span>-<span style="color:#a82e2e">10</span> time: <span style="color:#a82e2e">16</span>:<span style="color:#a82e2e">41</span> to change <span style="color:#114ba6">this</span> template use file settings file templates. -->
<%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>>


    


    </code></span></span>

c页面

<% //解决中文乱码问题 是在d.jsp后面携带数据跳转到d.jsp页面的,通过浏览器的,需要先按照UTF-8编码之后在进行传递。然后在d.jsp页面使用request.getParameter("username")获取数据 request.setCharacterEncoding("UTF-8"); //向域对象request中存储数据 request.setAttribute("age",19); %> <%--转发动作,携带的参数,可以在d.jsp上接收这参数,通过浏览器转发过去的,所以要想获取param携带的数据必须使用getparameter()方法获取数据--%>

d.jsp页面:

<span style="background-color:#fafafa"><span style="color:#222222"><code>javascript复制代码<%-- created by intellij idea. date: <span style="color:#a82e2e">2018</span><span style="color:#a82e2e">-10</span><span style="color:#a82e2e">-10</span> time: <span style="color:#a82e2e">16</span>:<span style="color:#a82e2e">41</span> to change <span style="color:#114ba6">this</span> template use file settings file templates. -->
<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>


    


    </code></span></span>

d页面

<%--获取request域对象中的数据--%> <%=request.getattribute("age")%> <%--获取转发param标签通过浏览器携带的数据--%> <%=request.getparameter("username")%>

案例演示

  1. 从c.jsp转发到d.jsp
  2. c在请求域中添加键和值,d看能够得到值并且输出
  3. c转发的时候带参数,username和age,在d中获取并且输出
  4. 汉字乱码问题的解决
  5. 转发,url地址栏并没有发生改变

效果

小结

  1. forward作用:在JSP页面上实现转发
  2. param的功能:在转发的时候提供其它的参数名和参数值

7、JSP页面常用对象

我们发现,我们在JSP页面中书写的代码最终都会翻译到_jspService()方法中,我们发现这个方法中有两个形参:HttpServletRequest对象 ,HttpServletResponse对象 。所以说,JSP的本质就是一个Servlet。我们可以直接在JSP页面上使用这两个对象。

【需求】登录页面改造

改造登录后的页面,用户登陆失败以后,跳转到login.jsp,在jsp页面中动态显示用户登陆错误中的信息。

【思路】

  1. 登录失败后直接转发到一个jsp页面;
  2. 在jsp页面上使用request对象获取request中的值;

【LoginServlet代码】

说明:LoginServlet中,登录失败之后,直接转发到login.jsp页面。

<span style="background-color:#fafafa"><span style="color:#222222"><code>ini复制代码<span style="color:#114ba6">protected</span> <span style="color:#114ba6">void</span> doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        <span style="color:#999999">//解决中文乱码问题</span>
        request.setCharacterEncoding(<span style="color:#00753b">"utf-8"</span>);
        <span style="color:#999999">//获取用户名和密码</span>
        <span style="color:#114ba6">String</span> username = request.getParameter(<span style="color:#00753b">"username"</span>);
        <span style="color:#114ba6">String</span> password = request.getParameter(<span style="color:#00753b">"password"</span>);
        UserServiceInter service = <span style="color:#114ba6">new</span> UserServiceInterImpl();
        <span style="color:#114ba6">boolean</span> result = service.login(username,password);
        <span style="color:#114ba6">String</span> msg = result ? <span style="color:#00753b">"用户登陆成功"</span> : <span style="color:#00753b">"用户登陆失败"</span>;
        request.setAttribute(<span style="color:#00753b">"msg"</span>,msg);
        <span style="color:#114ba6">if</span> (result){
            response.sendRedirect(<span style="color:#00753b">"/success.html"</span>);
        }<span style="color:#114ba6">else</span> {
            <span style="color:#999999">//转发到login.jsp页面</span>
            request.getRequestDispatcher(<span style="color:#00753b">"/login.jsp"</span>).forward(request,response);
        }
    }
</code></span></span>

【login.jsp页面】

<span style="background-color:#fafafa"><span style="color:#222222"><code>xml复制代码<span style="color:#114ba6"><%@ page contenttype=<span style="color:#00753b">'text/html;charset=UTF-8'</span> language=<span style="color:#00753b">'java'</span>></span>



    
    
    
    

    
    
    <span style="color:#114ba6"><script src=<span style="color:#00753b">"js/jquery.js"</span>></span><span style="color:#114ba6"></script></span>
    <span style="color:#114ba6"><script src=<span style="color:#00753b">"js/bootstrap.js"</span>></span><span style="color:#114ba6"></script></span>


<span style="color:#114ba6"><% string msg=<span style="color:#00753b">'(String)'</span> request.getattributemsg></span>
</code></span></span>

登录页面

<%=msg%> 登录

说明:上述代码中:

<span style="background-color:#fafafa"><span style="color:#222222"><code>css复制代码<span style="color:red"><span style="color:#114ba6"><%=msg%></span></span>
</code></span></span>

能够使用msg获取数据,因为编译之后存在于同一个类中,编译jsp如下所示:

效果图:浏览器访问login.html页面

登录密码输入错误:

小结:

  • JSP作用:给浏览器生成响应信息;
  • JSP特点:动态网页,html+java,由服务器来运行的。本质上是一个Servlet;
  • 书写Java代码的三种方式:
    • 脚本片段:java代码片段,在service方法中起作用。格式:<% system.out.printlnhello>;
    • 脚本表达式:直接在页面输出内容,在service方法中起作用,等价于out.print(内容)。格式:<%=>
    • 脚本声明:定义成员变量,方法。在当前类中都起作用。<%!int a='10;%'>
  • JSP页面常用的对象:request,response;
深入理解JSP框架技术 JSP(JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术。它允许开发者将Java代码嵌入到HTML页面中,用于创建动态内容。JSP技术背后的基本思想是将页面内容的生成与业务逻辑分离,便于团队开发和维护。JSP提供了丰富的内置对象,这些对象在JSP页面的开发中扮演了重要的角色。它们无需显式声明就可以在JSP页面中直接使用,大大简化了Web应用的开发。部分常用内置对象request:代表客户端的请求。response。 阅读详情

相关推荐

深入理解JSP与Servlet技术

性能优化是开发过程中不可或缺的一环,JSP-Servlet也不例外。可以分享在实践中如何对JSP页面进行优化,比如通过减少页面中scriptlet代码的使用、利用EL和JSTL标签库,以及在Servlet中合理使用缓存等技术来提高性能。同时,总结和分享项目中采取的最佳实践,如代码组织、安全性和可维护性,将有助于开发者成长。通过上述资源和途径的学习和实践,开发者能够全面掌握JSP-Servlet技术,为职业生涯打下坚实的基础。本文还有配套的精品资源,点击获取。

weixin_29025501的博客 992

jsp深入理解

个人理解: jsp技术是基于servlet技术的一个改进,将java代码和html的分离简化了编程的复杂度,jsp实际也是一个servlet。 jsp执行过程:客户端请求-action通过javabean传递变量给jsp-jsp通过jsp引擎编译成servlet源码-源码编译成class文件-执行class文件进行响应。 引用理解: http://blog.sina.com.cn...

dekuolu7073的博客 169

深入理解JSP BBS样例源码

本文还有配套的精品资源,点击获取 简介:JSP BBS样例源码为学习JSP技术的初学者提供了一个实用的学习材料。本教程将详细解析JSP页面指令、脚本元素,以及构建一个完整的BBS系统的关键组件,包括用户登录、主页展示、新帖发布、回复和搜索功能等。教程还将包括数据库设计、JSP页面实现、控制层实现、数据访问对象(DAO)和会话管理,以及安全性的考虑。学习此项目将帮助初学者全面...

weixin_28771751的博客 896

深入理解jsp技术

在创作的过程中,我收获了许多粉丝的关注和正向的反馈。我的文章得到了很多赞、评论以及阅读量,这些反馈不仅是对我工作的肯定,也是对我持续创作的动力。此外,通过创作,我还结识了许多志同道合的领域同行,与他们的交流和互相学习也为我带来了很多启发和提升。作为一个创作者,我的初心来源于日常学习中的记录和实战项目中的经验分享。我希望未来能够继续深耕于我所热爱的领域,不断提升自己的技术水平和创作能力。在有限的精力下,我会根据自己的时间安排和兴趣爱好,合理分配时间,确保创作不会影响到工作和学习的进度。访问量也达到了7w+;

m0_74436895的博客 1601

深入理解JSP:技术详解及翻译实践

在当今迅速发展的互联网世界中,Web应用的开发变得日益重要。JSP(Java Server Pages)作为一种服务器端脚本技术,为开发者提供了一种灵活的方式来构建动态网页。JSP的核心思想是简化页面开发,通过在HTML文档中嵌入Java代码片段来生成动态内容。这种方法的优势在于开发者能够利用熟悉而又强大的Java语言来编写服务器端逻辑,同时保持HTML代码的清晰和易于维护。JSP自推出以来,以其“一次编写,处处运行”的特点迅速成为构建Web应用的主流技术之一。

weixin_42506884的博客 923

深入理解Servlet与JSP技术

本文深入探讨了Servlet和JSP技术的核心概念和应用。从Servlet的基本介绍到工作原理,再到HTTP Servlet的特定功能,文章详细解析了Servlet的生命周期和接口。同时,对于Servlet会话管理、通信机制以及与JSP的对比分析也提供了丰富的信息。此外,文章还介绍了JSP的指令、动作元素和自定义标签,并引入了Struts框架作为Web开发的高级主题。通过实例和图表,文章帮助读者更深入地理解这些技术如何在实际的Web开发中应用。

weixin_42168902的博客 430

深入理解jsp

总体而言,JSP是一种强大而灵活的技术,使开发者能够在Web应用程序中结合Java代码和HTML,以实现动态内容生成和与服务器端的交互。JSP充当视图(View)的角色,负责呈现页面给用户,并与控制器(Controller)和模型(Model)进行交互,以完成数据处理和业务逻辑。%>)来标识Java代码块。标签库和标签:JSP支持自定义标签库和标签,这允许开发者创建可重用的自定义标签,以简化JSP页面的开发和维护。标签库和标签可以封装复杂的逻辑和功能,使其在JSP页面中以类似HTML标记的形式使用。

weixin_44943389的博客 65

深入理解JSP页面的内部机制与组件

本文深入探讨了Java Server Pages (JSP) 页面的关键组成部分和隐式对象,包括JSP标签的种类、注释、脚本片段和表达式,以及JSP页面中常用的九个隐式对象如out、page、request、response、session、config、exception和pageContext。通过实例展示了如何使用这些组件来处理Web请求、生成响应和管理会话。文章还讨论了JSP页面与Web容器的交互,为开发者提供了在Web应用中使用JSP页面的深入见解。

weixin_29935511的博客 665

Java Web开发的基石:深入理解Servlet与JSP​

本文深入解析Java Web开发的基石——Servlet与JSP技术。Servlet作为后台业务处理器,通过Java代码接收和响应HTTP请求;JSP则是将Java嵌入HTML的动态页面技术,两者共同构成了早期Java Web应用的核心。文章详细阐述了两者的工作原理、代码示例及协作模式,指出其形成的MVC雏形为现代框架奠定了基础。虽然当前主流技术已转向Spring等框架,但理解Servlet和JSP对掌握Web开发本质、维护传统系统仍具重要意义。这组黄金搭档展现了Java Web技术的历史演进,是开发者必须

Sagittarius_A*的博客 1106

记录:N10激光雷达串口编程,将数据存进 SQLite,并进行 ROS2 - cartographer 单雷达建图

N10 系列采用 TOF(time of flight)测距原理,通过测量调制激光的发射、返回时间差来测量物体与传感器的相对距离。激光发射器发出调制脉冲激光,内部定时器开始 从t1时刻计算时间,当激光照射到目标物体后,部分能量返回,当雷达接收到返回的激光信号时,在t2时刻停止内部定时器计时,光速C,激光雷达到达物体的距离D为:经过N10系列激光雷达内嵌的信号处理单元的实时解算得到探测物体的距离值,结合高精度自适应角度测量模块输出的角度信息,可以得到量程内周围 360 度环境 的二维平面信息。

m0_74013893的博客 1096

ROS水下仿真神器uuv_simulator:从零搭建水下机器人测试环境(附Gazebo配置全流程)

本文详细介绍了如何使用ROS和uuv_simulator从零搭建水下机器人仿真测试环境,包括Gazebo配置全流程。通过系统环境准备、水下世界构建、机器人模型定制开发等步骤,帮助开发者在虚拟海洋环境中高效验证算法,大幅降低研发成本。特别适合水下机器人研发人员参考。

ujm5678901的博客 263

深入理解JavaWeb(三)——JSP

JSP已经不适合主流的开发模式,但我们仍有必要去学习它;在本文中,我们对JSP进行了简单的阐述,而非深入地理解。以最低的成本快速上手JSP。

弄鹊 949

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1134

jsp代码项目例子_带你深入理解Servlet和JSP

Servlet是运行在Web服务器上的程序,它担当Web浏览器或其它http客户端发出的请求,与http服务器上的数据库或应用程序之间的中间层.它们的工作是执行如下所示的任务:读取客户程序发送的显式数据读取浏览器发出的隐式http请求数据生成结果向客户发送显式数据(即文档)发送隐式的http响应数据这5个工作步骤看起来比较抽象,我们举个具体的例子来说明.我们知道一个Servlet可以对应处理某个链...

weixin_39757743的博客 345

3D Slicer + MONAI Bundle实战:如何用Wholebrainseg模型快速分割133个脑区(附避坑指南)

本文详细介绍了如何利用MONAI Model Zoo中的Wholebrainseg模型,在3D Slicer环境中高效分割133个脑区。文章重点提供了数据预处理、GPU推理加速及结果精修等实战技巧与避坑指南,旨在帮助医学影像研究者和开发者提升全脑分割的精度与效率。

311

SAP MM新手避坑指南:工厂间调拨用301还是303?手把手教你选对移动类型

本文深入解析SAP MM模块中工厂间调拨的301与303移动类型,帮助新手避开常见陷阱。通过对比一步法(301)和两步法(303+305)的核心差异、适用场景及财务影响,提供清晰的决策框架和实战技巧,确保库存调拨的准确性和效率。

weixin_29223603的博客 346

深入理解JSP(一)

欢迎点击「算法与编程之美」↑关注我们!本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。在Java Web的开发过程中,可能有过这样的疑问,To...

算法与编程之美 1244

【人工智能】《Deep Dive into LLMs like ChatGPT 》—— Andrej Karpathy 第三阶段:强化学习(Reinforcement Learning, RL)

摘要:强化学习(RL)阶段通过让模型自主生成并验证答案,突破SFT阶段的模仿局限,使其在数学、代码等领域形成独特的推理路径。RL流程包括批量生成解答、自动批改筛选正确路径,并采用PPO/GRPO算法优化模型。模型会自发涌现自我检查、回滚等策略,显著提升正确率(如AIME竞赛准确率从15%升至56%)。与SFT模型相比,RL模型具备主动链式思维、验算能力,响应时间更长但效果更优,形成真正的“思考模型”。三阶段对比显示,RL通过可验证题的对错奖励机制,赋予模型超越人类范式的推理能力。

奶爸的编程之路,也就一周冷个三天 149

java servlet深入理解_深入理解JSP和Servlet

开始编写比较复杂的jsp啦。全称:javaserver pages在传统的网页HTML文件(.htm,.html)中加入java程序片段(Scriptlet)和jsp标签,就构成了jsp网页。1、因为可以嵌入java代码,由此具备动态特性。java程序段可以操纵数据库、重新定向网页以及发送E-mail等,实现建立动态网站所需要的功能。2、所有程序操作都是在服务器端执行,网络上传送给客户端的仅是得到...

weixin_34493203的博客 259

高通平台蓝牙学习-- 基于WCN6750 Bluetooth 5.2的讲解

摘要:蓝牙5.2解决方案WCN6750具备多项先进特性:完全兼容5.2标准及ANT+协议,支持2Mbps高速BLE和长距离传输;采用射频集成方案,与WLAN共享天线并支持5G并发;内置功率放大器,支持Class1/2传输;提供双音频流和Slimbus接口优化。其HCI UART接口支持3.2Mbps速率,通过BlueZ协议栈实现蓝牙5.2功能,包括2Mbps模式和长距离传输,符合核心规范要求。(149字)

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 3万+

网络系统管理专栏-配套练习+知识点详解

网络系统管理专栏-配套练习+知识点详解

bfq05234214的博客 682
上一篇: SpringBoot自带ThreadPoolTaskScheduler实现数据库管理定时任务
下一篇: Java常用JVM参数实战
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值