浅谈Servlet+JSP开发中不为人知的密码

采用JSP+Servlet+JavaBean+JDBC方式开发一个web登录程序 采用JSP+Servlet+JavaBean+JDBC方式开发一个web登录程序 1.选用开发环境:SQL Server 、JDK1.8、Tomcat7.0、Myeclipse 2014 2.开发模式及工作原理:                                                                                           ... 阅读详情

通过结合Servlet和JSP的MVC模式,我们可以发挥二者各自的优点:

*   Servlet实现业务逻辑;
*   JSP实现展示逻辑。

但是,直接把MVC搭在Servlet和JSP之上还是不太好,原因如下:

*   Servlet提供的接口仍然偏底层,需要实现Servlet调用相关接口;
*   JSP对页面开发不友好,更好的替代品是模板引擎;
*   业务逻辑最好由纯粹的Java类实现,而不是强迫继承自Servlet。

能不能通过普通的Java类实现MVC的Controller?类似下面的代码:

public class UserController {
        @GetMapping("/signin")
        public ModelAndView signin() {
            ...
        }

        @PostMapping("/signin")
        public ModelAndView doSignin(SignInBean bean) {
            ...
        }

        @GetMapping("/signout")
        public ModelAndView signout(HttpSession session) {
            ...
        }
    }

   

上面的这个Java类每个方法都对应一个GET或POST请求,方法返回值是`ModelAndView`,它包含一个View的路径以及一个Model,这样,再由MVC框架处理后返回给浏览器。

如果是GET请求,我们希望MVC框架能直接把URL参数按方法参数对应起来然后传入:    

@GetMapping("/hello")
    public ModelAndView hello(String name) {
        ...
    }

如果是POST请求,我们希望MVC框架能直接把Post参数变成一个JavaBean后通过方法参数传入:

@PostMapping("/signin")
    public ModelAndView doSignin(SignInBean bean) {
        ...
    }

为了增加灵活性,如果Controller的方法在处理请求时需要访问`HttpServletRequest`、`HttpServletResponse`、`HttpSession`这些实例时,只要方法参数有定义,就可以自动传入:

@GetMapping("/signout")
    public ModelAndView signout(HttpSession session) {
        ...
    }

以上就是我们在设计MVC框架时,上层代码所需要的一切信息。

### 设计MVC框架

如何设计一个MVC框架?在上文中,我们已经定义了上层代码编写Controller的一切接口信息,并且并不要求实现特定接口,只需返回`ModelAndView`对象,该对象包含一个`View`和一个`Model`。实际上`View`就是模板的路径,而`Model`可以用一个`Map<String, Object>`表示,因此,`ModelAndView`定义非常简单:

 public class ModelAndView {
        Map<String, Object> model;
        String view;
    }

比较复杂的是我们需要在MVC框架中创建一个接收所有请求的`Servlet`,通常我们把它命名为`DispatcherServlet`,它总是映射到`/`,然后,根据不同的Controller的方法定义的`@Get`或`@Post`的Path决定调用哪个方法,最后,获得方法返回的`ModelAndView`后,渲染模板,写入`HttpServletResponse`,即完成了整个MVC的处理。

这个MVC的架构如下:

 

其中,`DispatcherServlet`以及如何渲染均由MVC框架实现,在MVC框架之上只需要编写每一个Controller。

我们来看看如何编写最复杂的`DispatcherServlet`。首先,我们需要存储请求路径到某个具体方法的映射:


    @WebServlet(urlPatterns = "/")
    public class DispatcherServlet extends HttpServlet {
        private Map<String, GetDispatcher> getMappings = new HashMap<>();
        private Map<String, PostDispatcher> postMappings = new HashMap<>();
    }

处理一个GET请求是通过`GetDispatcher`对象完成的,它需要如下信息:

    

class GetDispatcher {
        Object instance; // Controller实例
        Method method; // Controller方法
        String[] parameterNames; // 方法参数名称
        Class<?>[] parameterClasses; // 方法参数类型
    }

有了以上信息,就可以定义`invoke()`来处理真正的请求:


    class GetDispatcher {
        ...
        public ModelAndView invoke(HttpServletRequest request, HttpServletResponse response) {
            Object[] arguments = new Object[parameterClasses.length];
            for (int i = 0; i < parameterClasses.length; i++) {
                String parameterName = parameterNames[i];
                Class<?> parameterClass = parameterClasses[i];
                if (parameterClass == HttpServletRequest.class) {
                    arguments[i] = request;
                } else if (parameterClass == HttpServletResponse.class) {
                    arguments[i] = response;
                } else if (parameterClass == HttpSession.class) {
                    arguments[i] = request.getSession();
                } else if (parameterClass == int.class) {
                    arguments[i] = Integer.valueOf(getOrDefault(request, parameterName, "0"));
                } else if (parameterClass == long.class) {
                    arguments[i] = Long.valueOf(getOrDefault(request, parameterName, "0"));
                } else if (parameterClass == boolean.class) {
                    arguments[i] = Boolean.valueOf(getOrDefault(request, parameterName, "false"));
                } else if (parameterClass == String.class) {
                    arguments[i] = getOrDefault(request, parameterName, "");
                } else {
                    throw new RuntimeException("Missing handler for type: " + parameterClass);
                }
            }
            return (ModelAndView) this.method.invoke(this.instance, arguments);
        }

        private String getOrDefault(HttpServletRequest request, String name, String defaultValue) {
            String s = request.getParameter(name);
            return s == null ? defaultValue : s;
        }
    }

上述代码比较繁琐,但逻辑非常简单,即通过构造某个方法需要的所有参数列表,使用反射调用该方法后返回结果。

类似的,`PostDispatcher`需要如下信息:


    class PostDispatcher {
        Object instance; // Controller实例
        Method method; // Controller方法
        Class<?>[] parameterClasses; // 方法参数类型
        ObjectMapper objectMapper; // JSON映射
    }

和GET请求不同,POST请求严格地来说不能有URL参数,所有数据都应当从Post Body中读取。这里我们为了简化处理,*只支持*JSON格式的POST请求,这样,把Post数据转化为JavaBean就非常容易。


    class PostDispatcher {
        ...
        public ModelAndView invoke(HttpServletRequest request, HttpServletResponse response) {
            Object[] arguments = new Object[parameterClasses.length];
            for (int i = 0; i < parameterClasses.length; i++) {
                Class<?> parameterClass = parameterClasses[i];
                if (parameterClass == HttpServletRequest.class) {
                    arguments[i] = request;
                } else if (parameterClass == HttpServletResponse.class) {
                    arguments[i] = response;
                } else if (parameterClass == HttpSession.class) {
                    arguments[i] = request.getSession();
                } else {
                    // 读取JSON并解析为JavaBean:
                    BufferedReader reader = request.getReader();
                    arguments[i] = this.objectMapper.readValue(reader, parameterClass);
                }
            }
            return (ModelAndView) this.method.invoke(instance, arguments);
        }
    }

最后,我们来实现整个`DispatcherServlet`的处理流程,以`doGet()`为例:


    public class DispatcherServlet extends HttpServlet {
        ...
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            resp.setContentType("text/html");
            resp.setCharacterEncoding("UTF-8");
            String path = req.getRequestURI().substring(req.getContextPath().length());
            // 根据路径查找GetDispatcher:
            GetDispatcher dispatcher = this.getMappings.get(path);
            if (dispatcher == null) {
                // 未找到返回404:
                resp.sendError(404);
                return;
            }
            // 调用Controller方法获得返回值:
            ModelAndView mv = dispatcher.invoke(req, resp);
            // 允许返回null:
            if (mv == null) {
                return;
            }
            // 允许返回`redirect:`开头的view表示重定向:
            if (mv.view.startsWith("redirect:")) {
                resp.sendRedirect(mv.view.substring(9));
                return;
            }
            // 将模板引擎渲染的内容写入响应:
            PrintWriter pw = resp.getWriter();
            this.viewEngine.render(mv, pw);
            pw.flush();
        }
    }

这里有几个小改进:

*   允许Controller方法返回`null`,表示内部已自行处理完毕;
*   允许Controller方法返回以`redirect:`开头的view名称,表示一个重定向。

这样使得上层代码编写更灵活。例如,一个显示用户资料的请求可以这样写:

    @GetMapping("/user/profile")
    public ModelAndView profile(HttpServletResponse response, HttpSession session) {
        User user = (User) session.getAttribute("user");
        if (user == null) {
            // 未登录,跳转到登录页:
            return new ModelAndView("redirect:/signin");
        }
        if (!user.isManager()) {
            // 权限不够,返回403:
            response.sendError(403);
            return null;
        }
        return new ModelAndView("/profile.html", Map.of("user", user));
    }

最后一步是在`DispatcherServlet`的`init()`方法中初始化所有Get和Post的映射,以及用于渲染的模板引擎:


public class DispatcherServlet extends HttpServlet {
    private Map<String, GetDispatcher> getMappings = new HashMap<>();
    private Map<String, PostDispatcher> postMappings = new HashMap<>();
    private ViewEngine viewEngine;

    @Override
    public void init() throws ServletException {
        this.getMappings = scanGetInControllers();
        this.postMappings = scanPostInControllers();
        this.viewEngine = new ViewEngine(getServletContext());
    }
    ...
}

如何扫描所有Controller以获取所有标记有`@GetMapping`和`@PostMapping`的方法?当然是使用反射了。虽然代码比较繁琐,但我们相信各位童鞋可以轻松实现。

这样,整个MVC框架就搭建完毕。

### 实现渲染

有的童鞋对如何使用模板引擎进行渲染有疑问,即如何实现上述的`ViewEngine`?其实`ViewEngine`非常简单,只需要实现一个简单的`render()`方法:


    public class ViewEngine {
        public void render(ModelAndView mv, Writer writer) throws IOException {
            String view = mv.view;
            Map<String, Object> model = mv.model;
            // 根据view找到模板文件:
            Template template = getTemplateByPath(view);
            // 渲染并写入Writer:
            template.write(writer, model);
        }
    }    

Java有很多开源的模板引擎,常用的有:

他们的用法都大同小异。这里我们推荐一个使用[Jinja](https://palletsprojects.com/p/jinja/)语法的模板引擎[Pebble](https://pebbletemplates.io/),它的特点是语法简单,支持模板继承,编写出来的模板类似:


    <html>
    <body>
      <ul>
      {% for user in users %}
        <li><a href="{{ user.url }}">{{ user.username }}</a></li>
      {% endfor %}
      </ul>
    </body>
    </html>

即变量用{{ xxx }}表示,控制语句用{% xxx %}表示。

使用Pebble渲染只需要如下几行代码:

public class ViewEngine {
    private final PebbleEngine engine;

    public ViewEngine(ServletContext servletContext) {
        // 定义一个ServletLoader用于加载模板:
        ServletLoader loader = new ServletLoader(servletContext);
        // 模板编码:
        loader.setCharset("UTF-8");
        // 模板前缀,这里默认模板必须放在`/WEB-INF/templates`目录:
        loader.setPrefix("/WEB-INF/templates");
        // 模板后缀:
        loader.setSuffix("");
        // 创建Pebble实例:
        this.engine = new PebbleEngine.Builder()
            .autoEscaping(true) // 默认打开HTML字符转义,防止XSS攻击
            .cacheActive(false) // 禁用缓存使得每次修改模板可以立刻看到效果
            .loader(loader).build();
    }

    public void render(ModelAndView mv, Writer writer) throws IOException {
        // 查找模板:
        PebbleTemplate template = this.engine.getTemplate(mv.view);
        // 渲染:
        template.evaluate(writer, mv.model);
    }
}

最后我们来看看整个工程的结构:

 

 

其中,framework包是MVC的框架,完全可以单独编译后作为一个Maven依赖引入,controller包才是我们需要编写的业务逻辑。

我们还硬性规定模板必须放在webapp/WEB-INF/templates目录下,静态文件必须放在webapp/static目录下,因此,为了便于开发,我们还顺带实现一个FileServlet来处理静态文件:

@WebServlet(urlPatterns = { "/favicon.ico", "/static/*" })
public class FileServlet extends HttpServlet {
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 读取当前请求路径:
        ServletContext ctx = req.getServletContext();
        // RequestURI包含ContextPath,需要去掉:
        String urlPath = req.getRequestURI().substring(ctx.getContextPath().length());
        // 获取真实文件路径:
        String filepath = ctx.getRealPath(urlPath);
        if (filepath == null) {
            // 无法获取到路径:
            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        Path path = Paths.get(filepath);
        if (!path.toFile().isFile()) {
            // 文件不存在:
            resp.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }
        // 根据文件名猜测Content-Type:
        String mime = Files.probeContentType(path);
        if (mime == null) {
            mime = "application/octet-stream";
        }
        resp.setContentType(mime);
        // 读取文件并写入Response:
        OutputStream output = resp.getOutputStream();
        try (InputStream input = new BufferedInputStream(new FileInputStream(filepath))) {
            input.transferTo(output);
        }
        output.flush();
    }
}

运行代码,在浏览器中输入URLhttp://localhost:8080/hello?name=Bob可以看到如下页面:

为了把方法参数的名称编译到class文件中,以便处理@GetMapping时使用,我们需要打开编译器的一个参数,在Eclipse中勾选Preferences-Java-Compiler-Store information about method parameters (usable via reflection);在Idea中选择Preferences-Build, Execution, Deployment-Compiler-Java Compiler-Additional command line parameters,填入-parameters;在Maven的pom.xml添加一段配置如下:

<project ...>
    <modelVersion>4.0.0</modelVersion>
    ...
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgs>
                        <arg>-parameters</arg>
                    </compilerArgs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

有些用过Spring MVC的童鞋会发现,本节实现的这个MVC框架,上层代码使用的公共类如GetMapping、PostMapping和ModelAndView都和Spring MVC非常类似。实际上,我们这个MVC框架主要参考就是Spring MVC,通过实现一个“简化版”MVC,可以掌握Java Web MVC开发的核心思想与原理,对将来直接使用Spring MVC是非常有帮助的。

小结

一个MVC框架是基于Servlet基础抽象出更高级的接口,使得上层基于MVC框架的开发可以不涉及Servlet相关的HttpServletRequest等接口,处理多个请求更加灵活,并且可以使用任意模板引擎,不必使用JSP。 

JSP作业4 - 使用JSP+JavaBean+Servlet实现用户登录注册页面 实验要求:将实验3中的系统用户登录和注册功能进行进一步设计完善。具体要求:(1)登录页面设计和注册页面设计(JSP实现)完善前面实验完成的页面设计(注意:注册页面中,密码应该输入2次,并进行确认验证) (2)创建Servlet至少包括3个Servlet:登录验证Servlet;注册信息处理Servlet;页面编码处理Servlet(过滤器)(3)创建JavaBean至少包括1个Jav 阅读详情

相关推荐

JSP+Servlet+Tomcat+Mysql实现注册、登陆、修改、添加、查看、分页实例之----密码修改

1、新建页面reset.jsp&lt;%-- Created by IntelliJ IDEA. User: lvjun Date: 2018-03-22 Time: 10:44 To change this template use File | Settings | File Templates. --%&gt; &lt;%@ page contentType="text/...

lvjunit 8702

Jsp与servlet的数据传输

其实jsp的本质就是servlet,Jsp经过编译之后就成了servlet,但Java虚拟机并不能识别JSP代码,当浏览器请求JSP页面时,JSP引擎会首先去检查是否需要编译这个文件。如果这个文件没有被编译过,或者在上次编译后被更改过,则编译这个JSP文件。JSP擅长在于页面显示,servlet则擅长逻辑控制,类似于.NET MVC的Controllers。Jsp生命周期结束后就会销毁servle...

csh的博客 5949

Eclipse JSP/Servlet 深入解析

JSP 是一种动态网页技术,它将 HTML 与 Java 代码相结合,使开发者能够轻松地创建动态网页。JSP 页面由 HTML 标签和 JSP 标签组成,其中 JSP 标签负责执行 Java 代码。Eclipse JSP/Servlet 是 Java Web 开发中的重要技术,掌握它们对于 Java Web 开发者来说至关重要。本文对 Eclipse JSP/Servlet 进行了深入解析,希望对读者有所帮助。字数统计:约 2000 字SEO 优化。

xyq2024的博客 1022

基于 servlet+jsp+mysql 的 javaWeb 个人博客

你知道的越多,你不知道的越多 点赞再看,养成习惯 如果您有疑问或者见解,欢迎指教: 企鹅:869192208 一、 开发背景 软件名称:基于 servlet+jsp+mysql 的 javaWeb 个人博客 使用对象:学习或了解过 java 基础课程,开始接触 javaWeb 的学生和软件爱好者 其他相关:基于 jsp+servlet+mysql 开发旅游推介网站和后台管理系统 二、 需求分析...

心猿码意 8044

Jdbc+Servlet+Jsp+MySQL 实现简单的登陆功能

登陆功能实现架构图: 思路:1.在jsp页面上实现表单,表单内容为:用户名输入框、用户密码输入框、登陆按钮、重置按钮。 2.将用户输入的用户名和密码去与数据库中已存储的用户和密码去比对。 如果正确,允许用户登陆,不正确,不允许用户登陆,并返回当前登陆界面。 3.将用户输入的用户名和密码进行空判断,为空时不允许用户登陆,并返回当前登陆界面。 4.当用户输入的用户名和密码正确,即允许用户登陆,...

zhang150114的博客 6102

修改密码jsp界面的ajax通过jquery的编写

jsp界面的代码 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>超市账单管理系统<...

weixin_44121079的博客 1071

java与servlet JSP_浅谈servlet与jsp的关系

servlet是用java语言编写的,是一个java类。主要功能是用来接受、处理客户端的请求,并把处理结果返回到客户端显示。jsp是servlet发展后期的产物。在没有jsp之前,servlet利用输出流动态生成整个html页面,输出内容包括每一个html标签和每个在html页面中出现的内容。html文件包含大量标签和大量静态文本及格式等,以及所有的表现逻辑,包括布局、色彩及图像等。这些内容都必须...

weixin_30375113的博客 451

JSP找回密码功能实现详解

Java Server Pages (JSP) 是一种用于开发动态web内容的技术。它是Java EE技术规范的一部分,提供了以Java代码片段嵌入在HTML页面中的方式来创建动态内容。JSP页面通常被编译成Servlet,然后由Servlet容器执行,这使得JSP成为了创建交互式网站的强大工具。Servlet是Java Servlet的简称,它是Java EE技术中用于生成动态Web内容的基础技术。

weixin_35459464的博客 975

使用eclipse创建Servlet项目,使用JSP/Servlet验证表单(包含jsp文件创建)

使用eclipse创建Servlet项目 建好后目录如下 以上是Servlet项目的根目录 以下将实现一个表单提交验证 会生成如下代码 你应该注意到一些问题了,继承 HttpServlet 报红线。(应该是缺少某些包)解决如下: 鼠标右击项目->Build Path->点击comfigure Build Path进入->选择java Bulid Path 如未解决,尝试其他方法。 另外,我修改了web.xml内容如下: <?xml version="1.0" encoding="

Leesnwen的博客 6757

JSP与Servlet实现登录注册系统实战

本文还有配套的精品资源,点击获取 简介:构建用户管理系统时,登录和注册功能是基础且核心的部分。本项目使用JSP和Servlet技术实现一个高效、安全的用户交互平台。JSP负责展示用户界面,而Servlet处理业务逻辑验证和数据存储。详细介绍了登录和注册的实现步骤,包括数据验证、数据库操作、安全性考量等。强调了用户体验和系统安全的重要性,并提供实现中需要关注的关键点。 ...

weixin_34718952的博客 1252

Allegro 16.6 高级技巧实战:用Region规则和动态间距搞定高密度连接器布局布线

本文深入探讨了Allegro 16.6在高密度连接器布局布线中的高级技巧,重点介绍了Region规则和动态间距属性的应用。通过局部规则覆盖和分层控制,解决0.5mm以下引脚间距的布线难题,提升PCB设计效率和质量。

weixin_30352645的博客 439

简单的JSP-Servlet登录,注册,修改密码操作

首先,用JSP写出最初的登录页面 function confirm() { document.form_enter.action="ConfirmServlet"; document.form_enter.submit(); } function modify() { document.form_enter.action="/jsp/enter/modif

轻轻一叶风 2万+

Outlook邮件规则实战:从自动化分类到GTD工作流整合

在信息过载的数字化办公环境中,自动化处理技术成为提升效率的关键。其核心原理是基于“条件-动作”的触发器模型,通过预设逻辑让系统自动执行重复性任务。这种自动化机制的技术价值在于将用户从繁琐的机械操作中解放出来,实现信息流的智能管控。在邮件管理这一典型应用场景中,自动化规则能精准处理项目邮件聚合、优先级分流等复杂需求。本文聚焦于微软Outlook的规则引擎,深入解析如何利用**规则引擎**和**触发器模型**构建高效的邮件处理系统,并进一步将其融入GTD(Getting Things Done)个人生产力框架,

weixin_31083901的博客 311

Servlet+JSP项目

项目介绍 使用servlet和jsp对数据库中信息进行增删改查, 首先创建一个动态web项目,以下为代码及解析。 思路 在http://www.cssmoban.com/cssthemes/houtaimoban/index_5.shtml上下载对应模板然后进行修改汉化。 设计数据库连接并将增删改查封装,javabean,dao层及其实现 在servlet中进行方法调用和jsp页面之间的转发,交互。 com.lyx.entity 此包下的类为: 创建一个与数据库中列对应的属性,get,set方法,以及需

LVYX109 4485

Avellaneda & Stoikov’s market-making strategy 工程化处理

前2篇文章详细介绍了AS存货模型的做市策略,这次对于这些公式里面一些希腊字母的取值是如何计算的,如何做工程化并应用到生产环境中做一些说明。这个里面有一些重要参数:很直观,可以直接取值的有:s = current market mid price (中间价,也就是【最佳卖价+最佳买价】/2)q = quantity of assets in inventory of base asset (也就是买入多少价值的股票数量)

weixin_42480337的博客 7068

从零开始跑通3DGS教程:(四)修改(缩放、空间变换)colmap生成的sfm结果

通过colmap进行的sfm的普通方式会丢失场景的物理尺度信息,并且并不在符合一般认知的坐标系下,本文将读取colmap生成的点云和相机pose,将其进行空间变换和缩放之后,重新保存,新保存的结果仍然可以被colmap读取以及进行后续的稠密重建以及3dgs等工作

诺有缸的高飞鸟的博客 1424

浅谈servlet与jsp的关系

servlet是用java语言编写的,是一个java类。主要功能是用来接受、处理客户端的请求,并把处理结果返回到客户端显示。Jsp是servlet发展后期的产物。在没有jsp之前,serv...

weixin_39037804的博客 237

杰理AC696N系列芯片外部中断使用教程

本教程详细介绍了杰理AC696N芯片的GPIO引脚中断唤醒功能实现方法。主要内容包括: 功能特点: 支持任意GPIO引脚配置为中断源 可灵活选择上升沿或下降沿触发 提供自定义中断回调函数接口 核心实现: 通过port_wkup_interrupt_init()函数配置GPIO属性 使用request_irq()注册中断服务程序 提供中断使能/关闭接口 注意事项: 此功能在低功耗模式下无效 需注意引脚冲突和中断优先级设置 建议在回调函数中实现简洁的逻辑 应用场景: 按键检测 外部信号监测 事件触发等 本方案提

qq_42014563的博客 944

Jsp与Servlet

JSP由HTML代码和JSP标签构成,可以方便地编写动态网页。Servlet完全是JAVA程序代码构成,擅长于流程控制和事务处理,通过Servlet来生成动态网页很不直观。jsp更擅长表现于页面显示,servlet更擅长于逻辑控制。

qq_32381773的博客 1250

SAP 生产订单归档简介

通常在使用了几年的SAP后,系统中会产生非常多的数据在系统中,特别是制造业的生产订单,常年的累积会存在很多的订单在系统中,这个时候就可以使用归档的功能,对生产订单进行处理。标记DLFL的前提是需要完成生产订单的差异结算,DLFL标记可以清除掉生产订单的相关需求和预留。6、在执行CO78选择删除,前面的操作相当于我们把需要归档的数据写入了数据库中,现在正式进行数据的归档删除。然后我们co03在去看生产订单,可以看到生产订单中多了删除的状态和标记的状态。我这里直接执行的程序PPARCHP1,效果其实是一样的。

我小时候很黑的博客 2284

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

巨正则蒙特卡洛—甲烷和二氧化碳的竞争吸附GCMC

Rockyoung 8018

第05章 Servlet和JSP应用

这是一套简单的javaweb基础课程,只包含servelt和jsp的基础部分

richieandndsc的博客 1416

【LDPC-7】LLR量化位宽对LDPC译码性能的影响分析——以最小和译码算法为例进行matlab仿真

最小和译码算法的步骤如下:最后译码结果如果满足或者完成所有迭代次数,则译码算法停止迭代,否则继续进行译码迭代操作。

FPGA/MATLAB学习教程/源码/项目合作开发 1471

java与jsp的关系_浅谈servlet与jsp的关系

servlet是用java语言编写的,是一个java类。主要功能是用来接受、处理客户端的请求,并把处理结果返回到客户端显示。Jsp是servlet发展后期的产物。在没有jsp之前,servlet利用输出流动态生成整个HTML页面,输出内容包括每一个HTML标签和每个在HTML页面中出现的内容。HTML文件包含大量标签和大量静态文本及格式等,以及所有的表现逻辑,包括布局、色彩及图像等。这些内容都必须...

weixin_36414025的博客 376

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

jsp与java的关系_浅谈servlet与jsp的关系

servlet是用java语言编写的,是一个java类。主要功能是用来接受、处理客户端的请求,并把处理结果返回到客户端显示。Jsp是servlet发展后期的产物。在没有jsp之前,servlet利用输出流动态生成整个HTML页面,输出内容包括每一个HTML标签和每个在HTML页面中出现的内容。HTML文件包含大量标签和大量静态文本及格式等,以及所有的表现逻辑,包括布局、色彩及图像等。这些内容都必须...

weixin_35589806的博客 218

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: Redis疑难问题解决方案与防范
下一篇: 新手快速搭建springboot项目
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值