理解 Servlet 和 JSP

深入理解 JSP 与 Servlet:原理、交互及实战应用 加载:当客户端首次请求访问一个 Servlet 时,Web 容器(如 Tomcat)会查找该 Servlet 的类文件,并将其加载到内存中。实例化:Web 容器使用new关键字创建 Servlet 类的实例。通常情况下,一个 Servlet 类在整个 Web 应用程序的生命周期中只会被实例化一次。初始化:实例化之后,Web 容器会调用 Servlet 的init()方法进行初始化操作。该方法只会被调用一次,常用于加载配置文件、建立数据库连接等初始化工作。服务。 阅读详情

理解 Servlet 和 JSP

最初接触 Java 的时候用它来做一些桌面程序,所以对 Java Web 方向没有深入研究过。后来接触了 SSM 和 Spring Boot 等框架之后渐渐转向了 Web 方向。不过,对于 Servlet 和 JSP,虽然经常在招聘信息和别人推荐的 Java 学习路线上面看到,对它们的理解一直处于模糊的状态。最近,专门找了相关的资料进行学习,花了两三个小时就大致看完了它们在 Java Web 中的地位和原理,特写此文记录一些理解。

1、Servlet 和 JSP 的重要性

首先,我们日常 Web 开发中很少接触 Servlet 和 JSP 是因为:

  1. 对于 Servlet,我们一直在使用。之所以没有印象是因为它们被封装进了框架中,比如 Spring MVC. 尽管我们使用 Spring MVC,还是要在 web.xml 中配置 Servlet 的信息。这就是 Servlet 配置,而 Servlet 的实现则交给了 Spring MVC 处理。
  2. 对于 JSP,如果我们做的是一些简单的页面,那么我们可以直接使用 Spring MVC 和 JSP 进行编写。这在一些项目中仍然在使用。但对于一些比较大型的网站,因为前后端分离,所以 Java Web 则更多地负责给前端提供 RESTFul 类型的接口。因此,我们接触和使用 JSP 的机会变少了而已。

尤其是 Spring Boot 出来之后,甚至 Tomcat 都被作为 Spring Boot 整体的一部分。我们接触 Servlet 和 JSP 的基础越来越少,那么我们还有必要学习它们吗?

答案是 YES. 这是因为 Spring MVC 也好,Spring Boot 也罢,本质上只是对 Servlet 进行了封装,简化了开发流程,使我们能够把更多的精力放在业务逻辑实现上。但如果想要深入研究和理解这些框架的原理,就无法绕开 Servlet 和 JSP 了。

2、Servlet、JSP 以及 Tomcat 之间的关系

Java Servlet 是运行在 Web 服务器或应用服务器上的程序,用来接收请求并对请求进行处理,并返回响应结果。Servlet 可以处理任何类型的请求,不过多数情况下,我们用它来处理来自浏览器的 Http 请求。我们可以在 Servlet 根据请求信息,将一个 HTML 作为文本响应给客户端,并最终呈现一个页面给用户。

而 JSP(全称 Java Server Pages)是一种动态网页开发技术,以 Java 作为脚本语言,文件后缀名为 *.jsp。从形式上面看 JSP 包含了 Java 和 HTML 代码。当请求达到服务器的时候,当服务器识别出该请求是 JSP 请求之后,会将该请求传递给 JSP 引擎。JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet(Java 代码)。然后就得到了 JSP 对应的 Servlet,之后就将其作为 Servlet 使用,接收请求,处理,并返回结果。

所以,我们可以理解成 JSP 是 Servlet 的一种简化使用方式。因为在 Servlet 中,你不得不以文字的形式拼接出一个 HTML 字符串并返回。而使用 JSP,把责任反了过来,在 HTML 中嵌入 Java 代码,然后再把整个文件翻译成 Servlet 代码。

那么 Tomcat 呢?Tomcat 是 Servlet 容器,除了 Tomcat,还有 Jetty 可以作为 Servlet 容器。本质上,这类的容器做了一些工作,来提升我们 Servlet 程序的效率,比如对多线程进行管理等等。所以,从这个角度上将,我们的 Servlet 更像是一个接口,我们定义了要实现的逻辑,然后它们被放进 Tomcat 中执行。(Tomcat 本身也就是启了一个 main 函数和一个无限循环来不断对请求进行处理,所以,我们的 Servlet 对 Tomcat 而言只是一段代码。)

3、Servlet 的使用和规范

3.1 Servlet 的基础用例

Servlet 可以使用 javax.servlet 和 javax.servlet.http 包创建。Servlet 有三个生命周期方法它们会在各自的生命周期中被调用:

  1. init() 方法进行初始化。
  2. service() 方法来处理客户端的请求。
  3. destroy() 方法终止。

service() 方法中会对请求进行处理。以 HttpServlet 为例,它会在 service() 方法中,根据请求的 Method 信息调用 doGet()、doPost() 和 doPut() 等方法。以下面的代码为例,

public class HelloWorld extends HttpServlet {
 
    private String message;

    @Override
    public void init() throws ServletException {
        // 执行必需的初始化
        message = "Hello World";
    }

    @Override
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应内容类型
        response.setContentType("text/html");
        // 实际的逻辑是在这里
        PrintWriter out = response.getWriter();
        out.println("<h1>" + message + "</h1>");
    }

    @Override
    public void destroy() {
        // 什么也不做
    }
}

这里用来处理 GET 类型的请求,并通过 HttpServletResponse 中获取的输出流将最终的 HTML 返回给客户端。这里的处理比较简单,如果需要获取其他的信息,比如 Cookie、Session 等信息都可以从 HttpServletRequest 中进行获取。如果想要将 Cookie、Session 等返回给客户端,也是通过 HttpServletResponse 进行输出。如果是 POST 类型提交的表单,我们也是使用 HttpServletRequest 和 HttpServletResponse 进行读写的。它们提供了哪些方法,以及如何进行读写我们不再进行详细说明,参考相关的 API 或者示例代码即可。(可以参考:Servlet-教程)。

按照上面这样写完了 Servlet 之后,我们还需要在 Tomcat 中配置才行。默认情况下,Servlet 应用程序位于路径 Tomcat 安装目录/webapps/ROOT 下,且类文件放在 Tomcat 安装目录/webapps/ROOT/WEB-INF/classes 中。如果您有一个完全合格的类名称 com.myorg.MyServlet,那么这个 Servlet 类必须位于 WEB-INF/classes/com/myorg/MyServlet.class 中。

现在,让我们把 HelloWorld.class 复制到 Tomcat 安装目录/webapps/ROOT/WEB-INF/classes 中,并在位于 Tomcat 安装目录/webapps/ROOT/WEB-INF/ 的 web.xml 文件中创建以下条目:

<web-app>      
    <servlet>
        <servlet-name>HelloWorld</servlet-name>
        <servlet-class>HelloWorld</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>HelloWorld</servlet-name>
        <url-pattern>/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>  

这里的 <servlet> 标签配置了 Servlet 的类,<servlet-mapping> 标签中配置了给 Servlet 用来处理的 URL 的类型。

3.2 Servlet 过滤器

配置在 Web.xml 中的内容,除了 Servlet 还有 Servlet 过滤器。过滤器用来动态地拦截请求和响应,处理,并交给 Servlet 执行。可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。可以被用来进行字符串编码、身份验证过滤器、数据压缩、加密、触发资源访问事件、图像转换过滤器等。

过滤器是需要用到 javax.servlet.Filter 接口,它也提供了三个生命周期相关的方法:

  1. init() 初始化过滤器的时候调用
  2. doFilter() 该方法完成实际的过滤操作
  3. destroy() 在销毁过滤器实例前调用该方法

在使用的时候,我们只需要覆写这三个方法,然后将其注册到 web.xml 中即可。比如,

// 实现 Filter 类
public class LogFilter implements Filter {
    public void  init(FilterConfig config) throws ServletException {
        // 获取初始化参数
        String site = config.getInitParameter("Site"); 
        // 输出初始化参数
        System.out.println("网站名称: " + site); 
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 输出站点名称
        System.out.println("站点网址:http://www.runoob.com");
        // 把请求传回过滤链
        chain.doFilter(request,response);
    }

    public void destroy() {
        /* 在 Filter 实例被 Web 容器从服务移除之前调用 */
    }
}

然后,将它注册到 web.xml 中,

<?xml version="1.0" encoding="UTF-8"?>  
<web-app>  
    <filter>
        <filter-name>LogFilter</filter-name>
        <filter-class>com.runoob.test.LogFilter</filter-class>
        <init-param>
            <param-name>Site</param-name>
            <param-value>菜鸟教程</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>LogFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <servlet>  
        <!-- 类名 -->  
        <servlet-name>DisplayHeader</servlet-name>  
        <!-- 所在的包 -->  
        <servlet-class>com.runoob.test.DisplayHeader</servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>DisplayHeader</servlet-name>  
        <!-- 访问的网址 -->  
        <url-pattern>/TomcatTest/DisplayHeader</url-pattern>  
    </servlet-mapping>  
</web-app>  

从上面的配置文件中可以看出,配置过滤器的方式和配置 Servlet 一样,都是先通过标签定义本身,然后再定义一个 mapping 并指定要匹配的 url. 注意:web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。

4、JSP

4.1 JSP 的生命周期

JSP 生命周期中所走过的几个阶段:

  1. 编译阶段:Servlet 容器编译 Servlet 源文件,生成 Servlet 类;
  2. 初始化阶段:加载与 JSP 对应的 Servlet 类,创建其实例,并调用它的初始化方法,可以通过覆写 jspInit() 实现该阶段的逻辑;
  3. 执行阶段:调用与 JSP 对应的 Servlet 实例的服务方法;
  4. 销毁阶段:调用与 JSP 对应的 Servlet 实例的销毁方法,然后销毁 Servlet 实例,可以通过覆写 jspDestroy() 实现该阶段的逻辑。

以下是 JSP 的一个示例,它的作用的原理就是,将 HTML 部分变成字符串,然后 <%! %> 包裹的 Java 代码转换成 Servlet 的代码。最终执行 Java 代码之后将完整的字符串返回给客户端,

<!-- 解决中文编码问题 -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<html>
    <head>
        <title>life.jsp</title>
    </head>
    <body>
        <%! 
        private int initVar=0;
        private int serviceVar=0;
        private int destroyVar=0;
        %>
        
        <%!
        public void jspInit(){
            initVar++;
            System.out.println("jspInit(): JSP被初始化了"+initVar+"次");
        }
        public void jspDestroy(){
            destroyVar++;
            System.out.println("jspDestroy(): JSP被销毁了"+destroyVar+"次");
        }
        %>

        <%
        serviceVar++;
        System.out.println("_jspService(): JSP共响应了"+serviceVar+"次请求");

        String content1="初始化次数 : "+initVar;
        String content2="响应客户请求次数 : "+serviceVar;
        String content3="销毁次数 : "+destroyVar;
        %>
        <h1>菜鸟教程 JSP 测试实例</h1>
        <p><%=content1 %></p>
        <p><%=content2 %></p>
        <p><%=content3 %></p>
    </body>
</html>

4.2 JSP 的语法

JSP 的脚本程序:可以包含任意量的Java语句、变量、方法或表达式,语法格式是:

<% 代码片段 %>

JSP 声明:可以声明一个或多个变量、方法,供后面的 Java 代码使用。语法格式:

<%! declaration; [ declaration; ]+ ... %>

JSP 表达式:包含的脚本语言表达式,先被转化成 String,然后插入到表达式出现的地方。语法格式:

<%= 表达式 %>

JSP 注释:常用的主要有两种:

  1. <%-- 注释 --%> JSP注释,注释内容不会被发送至浏览器甚至不会被编译
  2. <!-- 注释 --> HTML注释,通过浏览器查看网页源代码时可以看见注释内容

JSP 指令:用来设置与整个JSP页面相关的属性。语法格式:

<%@ directive attribute="value" %>

这里有三种指令标签:

指令描述
<%@ page ... %>定义页面的依赖属性,比如脚本语言、error 页面、缓存需求等等
<%@ include ... %>包含其他文件
<%@ taglib ... %>引入标签库的定义,可以是自定义标签

JSP 行为:使用 XML 语法结构来控制 Servlet 引擎。语法格式:

<jsp:action_name attribute="value" />

一些可用的 JSP 行为标签:

一些可用的 JSP 行为标签

JSP 隐含对象:JSP 支持九个自动定义的变量,江湖人称隐含对象。这九个隐含对象的简介见下表:

JSP 隐含对象

其他:JSP 的控制语句、运算符号和变量类型与 Java 一致。

参考:

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

相关推荐

Ubuntu Server 22.04.5系统安装教程

该教程主要是演示在服务器上安装Ubuntu server 22.04系统的详细步骤,主要包含,安装系统前的准备(镜像的下载,启动盘的制作),安装系统时的语言选择,网络设置,切换镜像源(可根据实际需求来配置,本文使用清华镜像源),手动分区,用户设置,ssh服务安装等。以上就是关于Ubuntu Server 22.04系统安装的详细过程。

逆水行舟,不进则退。 7758

浅谈Servlet和JSP

用Java构建基于web的应用程序时,Servlet和JSP是两种主要的技术,虽然这两种技术主要目的差不多,但是两者之间还是有着不小的区别。不过在此之前先了解一下Servlet和JSP。 1.Servlet Servlet也叫Java servlet,他是在web或服务器上运行的程序,本质上是一个类。是独立于操作系统平台和网络传输协议的服务器端的Java应用程序。他拥有一个生命周期,包含init()和destroy()方法。 五个抽象方法: void init(ServletConfig confi

qq_49608243的博客 1587

TRK-MPC5634M开发板实战:从硬件解析到CAN、ADC外设驱动调试

在嵌入式系统开发,尤其是汽车电子和工业控制领域,微控制器(MCU)是核心执行单元。其工作原理基于处理器内核、存储器和丰富的外设接口协同工作,通过软件编程实现对硬件的精确控制。这种技术价值在于能够为严苛环境提供可靠、实时的控制解决方案。典型的应用场景包括汽车车身控制、网关、电池管理系统以及工业自动化设备。本文聚焦于恩智浦(NXP)基于Power Architecture e200z0内核的汽车级MCU——MPC5634M,并以其官方评估板TRK-MPC5634M为平台,深入探讨其硬件设计逻辑、软件环境搭建及核

weixin_29997523的博客 288

JSP和Servlet的区别(servlet生命周期)

在说JSP和servlet的区别先说说servlet(因为JSP在本质上就是Servlet,只是两者的创建方式不一样)   Servlet工作原理: 1.     在客户端对web服务器发出请求 2.     web服务器接收到请求后将其发送给Servlet 3.     Servlet容器为此产生一个实例对象并调用ServletAPI中相应的方法来对客户端HTTP请求进行处理,然后将处...

念念不忘,必有回响 5078

冲压机器人系列编程:ABB IRB 6700_(6).RAPID编程语言入门

主菜单:包含文件、编辑、视图、工具等常用操作。项目浏览器:显示当前项目的文件结构,包括机器人模型、程序模块等。图形界面:用于创建和编辑机器人的虚拟环境。RAPID代码编辑器:用于编写和编辑RAPID代码。仿真控制面板:用于控制仿真过程,包括启动、暂停、停止等。变量是存储数据的容器,可以通过变量名访问和修改其存储的数据。变量定义时需要指定其类型和名称。% 定义一个整数变量并赋初值% 定义一个实数变量,未赋初值函数定义时需要指定其返回类型和参数。num result;子程序类似于函数,但不返回值。

zhubeibei168的博客 1378

lammps教程:官方自带eam_database程序拟合EAM势方法介绍

使用lammps模拟金属体系,最常用的势函数为eam、meam势。 对于大多数金属或者合金来说,可以从网上下载相对应的eam或meam势力场文件。 而对于一些新的合金材料,可能就找不到相对应的力场文件。 解决的方法有两种,一是采用混合势(pair_style hybrid),第二种方法是自己拟合势函数文件。 混合势的写法在前面文章中已经介绍过,本文介绍一种拟合EAM势的方法。 该方法是运行Xiaowang Zhou编写的一个拟合程序,该程序可自动生成所需要的合金势。 这个程序能够拟合的合金元素有: Cu,

lammps_jiayou的博客 4613

Jsp与Servlet(基本介绍)

Jsp与Servlet基本介绍Jsp与Servlet Jsp与Servlet   Servlet 技术是一种基于 Java 语言,用于创建 Web 应用程序(处在服务器端并生成动态网页)。   由于 java 语言,Servlet 技术变得可靠并且可扩展。servlet API 中有很多接口和类,如:Servlet,GenericServlet,HttpServlet,ServletRequest,ServletResponse 等。   Servlet 可以通过多种方式进行描述,具体取决于上下文。 Se

faramita_of_mine的博客 540

【Unity】【VR】如何让Distance Grab抓取物品时限制物品的Rotation

VR中Canvas抓取旋转问题的解决方案 在VR应用中,Canvas作为UI面板常需被抓取拖动,但默认会随手柄产生Z轴旋转,导致UI歪斜。Unity的Rigidbody冻结旋转功能对此无效,因为XR抓取直接修改Transform而非物理模拟。

每日出拳老爷子的博客 611

JavaWeb Servlet理解

一、Servlet概念 Servlet是在服务器上运行的小程序。一个Servlet就是一个Java类,并且可以通过“请求-响应”编程模型来访问的这个驻留在服务器内存里的Servlet程序。 Servlet定义:Servlet是基于Java技术的Web组件,由容器管理并产生动态的内容。Servlet引擎作为WEB服务器的扩展提供支持Servlet的功能。Servlet与客户端通过Servlet容...

热心网友 1234

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

【LAMMPS学习】五、LAMMPS命令(8) Pair_style 势

所有LAMMPS pair_style命令如下表所示。有些样式有加速版本。这由括号中的附加字母表示:g = GPU, i = INTEL, k = KOKKOS, o = OPENMP, t = OPT。

荷塘阅色 3015

Jsp和Servlet的关系(通俗易懂)

文章目录一、JSP的概念及作用二、Servlet的问题三、JSP的简单创建四、JSP与Servlet的联系与区别五、JSP实现原理 一、JSP的概念及作用 JSP是简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页。在仅使用Servlet的web应用开发中,部分Servlet代码通过使用打印语句打印HTML标签来在浏览器中显示页面,而JSP可以代替显示页面的Servlet。 二、Servlet的问题 在学习JSP之前,服务器通过Servlet响应客户端界面,会有一些

weixin_41121133的博客 2万+

第1章 环境准备

本章是 Kubernetes 高可用集群部署的前置基础环境配置,所有节点必须严格按顺序执行。主要内容包括:节点规划(IP、角色、配置要求)、VMware 克隆节点环境清理(解决 MAC 地址和主机名冲突)、统一工作目录创建、主机名与 hosts 解析配置、系统基础升级、防火墙与 swap 关闭、内核模块加载(overlay、br_netfilter、ip_vs)、网络参数优化(IP 转发、桥接过滤)、时间同步配置等。Ubuntu 24.04 内核 6.8+ 原生支持 eBPF 和 IPVS,无需手动升级内核

幸福街--linux技术分享 210

如何理解jsp就是Servlet

如何理解jsp就是Servlet 开发工具与关键技术:java 基础 作者:彭春怡 撰写时间:2020年08月09日 既然要理解jsp和Servlet那么就先介绍一下jsp和Servlet Servlet是sun公司提供的一门用于开发动态web资源的技术。Sun公司在其API中提 供 了一个servlet接口, 用户若想用发一个动态web资源(即开发一个Java程序向浏览器 输出数据),需要完成以下2个步骤:   (1)编写一个Java类,实现servlet接口。   (2)

weixin_44540196的博客 1280

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

JSP Servlet 相关理解

Servlet & JSP 一、是什么 JSP (Java Server Pages) Sun公司出品,用来作为服务器端动态页面技术的组件规范。其为.jsp后缀的文件,主要为html和Java代码。 Servlet (Server Applet) Sun公司出品,用来扩展Web服务器功能的组件规范,属于服务器程序。其为.java后缀文件,extends HttpServlet的相关类。 通俗理解 JSP:在Html里面写Java Servlet:在Java里面写html代码 二、区别与联系 运行

qq_43183340的博客 427

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Servlet+JSP的框架理解

由于目前主流使用SpringBoot进行开发Servlet可以说是时代的眼泪,这篇文章主要介绍我基于SpringBoot对应Servlet的浅薄认知,有利于更好的理解前端界面和java服务器的数据交换过程。

y_k_j_c的博客 961

对JSP和Servlet的理解

********************************Servlet*************************************1、路径不管用什么方式提交,我们都在doGet()里面接收,再在doPost里调用doGet()方法客户端跳转,进行了两次,服务端跳转进行了一次,可以传递数据!!!!!!!!!!!!!******2、web.xml<servlet>...

weixin_30679823的博客 133

本人对servlet和jsp的初级理解

[size=x-small][/size]总结:Servlet的生命周期,以及Servlet的访问过程 Servlet的生命周期和访问过程: 创建servlet实例 调用servlet中的init()方法初始化 service方法中的 Doget()和dopost()方法处理请求 4.当服务器关闭或者请求超时就会调用destory()方法,服务终止 在servlet的生命周期过程中,...

zxy653956033的博客 284

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*的博客 1105

关于http在servlet以及jsp中的一些理解

首先,谈一谈http的流程 浏览器发送http请求到服务器,服务器经过处理返回http响应到浏览器,浏览器解析网页显示到屏幕 http请求报文 GET /login.jsp HTTP/1.1 Accept:image/gif.image/jpeg,*/* Accept-Language:zh-cn Connection:Keep-Alive Host:localhost User-Agent

qq_28865793的博客 436

Servlet:JSP理解

1. jsp的作用:   * Servlet:     > 缺点:不适合设置html响应体,需要大量的response.getWriter().print("")     > 优点:动态资源,可以编程。   * html:     > 缺点:html是静态页面,不能包含动态信息     > 优点:不用为输出html标签而发愁   * jsp(java server pages):

熊诗言的博客 854

对 Jsp及Servlet 的理解

Servlet的生命周期: 所谓生命周期,指的是Servlet容器是如何创建Servlet实例、分配其资源,调用其方法,并销毁其实例的整个过程 1. 加载servlet 2. 实例化servlet 3. 调用init(),进行初始化 4. 调用service,派遣与请求相对应的doXXX方法,运行(以多线程的方式运行service() ); 5. 服务终止,调用destory,将其

望向明天 1491

JSP,HTML,Servlet,JS的理解和区别

@小白初学Java 1、Servlet 简介   Servlet(Server Applet)实际上是Java的1个接口,是一种服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求(Web浏览器或其他HTTP客户程序)与服务器响应(HTTP服务器上的数据库或应用程序)的中间层。    Servlet是位于Web服务器内部的服务器端的Java应用程序,与传统的从命令行启动的Java应用程序不同,Servlet由Web服务器进行加载,该Web服务器必须包含支持Ser

qq_41065770的博客 3257

JavaScript、Servlet、JSP理解

JavaScript、Servlet、JSP理解 一、JavaScript(JS): JavaScript是一种小型的、轻量级的、面向对象的、跨平台的脚本语言,用于控制页面内容,实现网页浏览者与网页内容之间的交互。 作用:表单数据验证、动态HTML、用户交互、数据绑定、少量数据查找、Ajax核心技术。 HTML中加入JavaScript代码: 1、<script></script>标记对(内嵌式) <html> <script> alert("hello")

qq_44787933的博客 1325

java servlet jsp 实例_跟永哥学JSP:一个案例三种实现,教你理解Jsp、javabean、Servlet(精)...

很多初学JSP页面、javabean技术和Servlet,但并不知道怎么用,什么时候用?今天我们通过一个求圆面积的实例,分别使用三种方法来实现,深入理解Jsp、javabean、Servlet:jsp页面代码JavabeanServlet跟永哥学JSP:一个案例三种实现,教你理解Jsp、javabean、Servlet(精),为125建站网原创,未经允许严禁转载。一、Jsp实现求圆的面积r.htm...

weixin_32518317的博客 214

JSP和Servlet的简单初步理解

JSP  JSP编译好的Class文件继承了HttpServletBase 而HttpServletBase又继承了HttpServlet   HttpServlet又实现了Servlet和ServletConfig接口(配置Servlet信息的接口)   Servlet 根据我的理解Servlet就是一个继承了HttpServlet的普通类   只不过JSP和Servlet  前者...

Ein_Blatt的博客 288
上一篇: 对 Spring 事务管理机制及其配置方式的总结
下一篇: C++ 复习笔记
开发者如是说
博客等级 码龄10年 67粉丝 163原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值