一文讲透Vue3服务器端渲染: 比较SSR和SSG的应用和优势

‍♂️ 诸位好,吾乃诸葛妙计,编程界之翘楚,代码之大师。算法如流水,逻辑如棋局。

吾之笔记,内含诸般技术之秘诀。吾欲以此笔记,传授编程之道,助汝解决技术难题。

 吾之文章,可使汝在编程之路上,少走弯路,更上层楼,攀技术之巅峰。

若此篇文章对阁下有所裨益, 敬请-点赞 ⭐ - 收藏  - 关注

目录

一、Vue 3服务器端渲染(SSR)概述

基本概念

Vue 3中的实现方式

案例说明

二、Vue 3静态站点生成(SSG)基础

工作原理

在Vue 3中使用SSG

案例说明

三、性能对比:Vue 3 SSR vs SSG

加载时间

服务器负载

案例说明

四、SEO优化:SSR与SSG在搜索引擎优化中的角色

SSR (服务器端渲染)对SEO的影响

SSG (静态站点生成)对SEO的影响

最佳实践

五、用户体验(UX):SSR与SSG的考量

首屏加载时间

交互性

案例说明

六、缓存策略:在Vue 3 SSR和SSG中的应用

SSR中的缓存策略

SSG中的缓存策略

案例说明

七、构建与部署:SSR与SSG的流程差异

SSR项目的构建和部署

SSG项目的构建和部署

案例说明

八、动态内容处理:SSR与SSG的解决方案

SSR中处理动态内容

SSG中处理动态内容

案例说明

九、安全性考虑:SSR与SSG的安全隐患及防护

SSR的安全问题

SSG的安全问题

防护措施的案例说明

十、总结

用户体验

缓存策略

构建与部署

处理动态内容

安全问题


一、Vue 3服务器端渲染(SSR)概述

基本概念

服务器端渲染(SSR)是一种技术,它允许JavaScript框架在服务器上生成完整的HTML页面,然后将这些页面发送到客户端。这与传统的客户端渲染(CSR)不同,在CSR中,HTML页面最初是空的,所有内容的渲染都是在浏览器中通过JavaScript完成的。

SSR的主要优势包括:

  • 更快的首屏加载时间:用户可以更快地看到页面的第一屏内容,因为服务器已经预先渲染了页面。

  • 更好的搜索引擎优化(SEO):由于页面内容在服务器上已经生成,搜索引擎爬虫可以更容易地抓取和索引站点内容。

  • 更好的社交媒体分享:当页面被分享到社交媒体时,预渲染的HTML可以确保正确的预览图和描述。

Vue 3中的实现方式

在Vue 3中,SSR可以通过使用官方支持的SSR库或框架来实现,例如@vue/server-renderer。这个库提供了将Vue组件渲染为服务器端HTML字符串的能力。

实现Vue 3 SSR的基本步骤通常包括:

  1. 创建Vue应用:使用createSSRApp方法创建一个Vue应用实例,这与客户端应用的创建方式类似,但专门用于SSR。

  2. 服务器设置:在Node.js服务器上设置一个服务,用于处理入站请求,并为每个请求创建新的Vue应用实例。

  3. 组件渲染:使用renderToString函数从@vue/server-renderer将Vue应用实例渲染为HTML字符串。

  4. HTML响应:将渲染好的HTML字符串作为响应发送给客户端。

  5. 客户端激活:客户端接收到HTML后,Vue客户端应用会"激活"这些静态标记,使其变为动态的,可以响应用户交互。

案例说明

假设我们有一个简单的Vue 3应用,我们想要在服务器上渲染它。以下是一个简化的例子:

// server.js
const { createSSRApp } = require('vue');
const { renderToString } = require('@vue/server-renderer');
const express = require('express');
const app = express();

app.get('*', async (req, res) => {
  const vueApp = createSSRApp({
    data() {
      return { message: 'Hello, SSR!' };
    },
    template: `
{{ message }}
` }); try { const appContent = await renderToString(vueApp); const html = ` Vue 3 SSR Example ${appContent} `; res.send(html); } catch (err) { res.status(500).send('Server Error'); } }); app.listen(3000, () => { console.log('Server is running on port 3000'); });

在这个例子中,我们使用了Express.js作为服务器框架。对于任何请求,我们都创建一个新的Vue应用实例,然后使用renderToString函数将其渲染为HTML字符串。最后,我们将这个HTML字符串作为响应发送给客户端。

这个简单的例子展示了Vue 3 SSR的基本概念和实现方式。在实际的生产环境中,你可能需要考虑更多的因素,比如路由、状态管理、数据预取等。

二、Vue 3静态站点生成(SSG)基础

工作原理

静态站点生成(SSG)是一种预渲染技术,它在构建时生成所有必要的HTML页面。与服务器端渲染(SSR)不同,SSG不需要服务器动态生成页面内容,因为所有页面在构建阶段就已经生成好了。

SSG的主要优势包括:

  • 更快的加载速度:静态文件可以直接由CDN提供,减少了服务器处理时间。

  • 更高的安全性:没有服务器端动态执行代码,减少了安全漏洞的风险。

  • 更低的托管成本:静态文件可以托管在任何静态文件服务器上,通常成本较低。

在Vue 3中使用SSG

在Vue 3中,可以使用像VitePress或VuePress这样的静态站点生成器,或者使用像Vite或Webpack这样的构建工具配合SSG插件来实现静态站点的生成。

以下是使用VuePress作为静态站点生成器的基本步骤:

  1. 安装VuePress:在你的Vue项目中安装VuePress作为一个依赖。

  2. 创建文档:按照VuePress的约定,创建Markdown文件和配置文件。

  3. 构建静态站点:运行VuePress构建命令,生成静态文件。

  4. 部署站点:将生成的静态文件部署到静态文件服务器或CDN上。

案例说明

假设我们有一个Vue 3项目,并且我们想要使用VuePress来生成静态站点。以下是一个简化的例子:

首先,安装VuePress:

npm install -D vuepress

然后,在项目根目录下创建一个名为docs的文件夹,并在其中创建一个README.md文件:

# Hello VuePress

Welcome to your VuePress site.

接下来,添加一个scripts字段到你的package.json文件中,以便能够使用npm命令来启动VuePress:

{
  "scripts": {
    "docs:dev": "vuepress dev docs",
    "docs:build": "vuepress build docs"
  }
}

现在,你可以使用以下命令来本地运行VuePress:

npm run docs:dev

当你准备好生成静态站点时,运行以下命令:

npm run docs:build

VuePress将在docs/.vuepress/dist目录下生成静态文件。最后,你可以将这个dist目录的内容部署到任何静态文件托管服务,如GitHub Pages、Netlify或Vercel。

这个简单的例子展示了如何在Vue 3项目中使用VuePress进行静态站点生成。在实际的生产环境中,你可能需要配置更多的VuePress选项,添加自定义主题,或者集成其他构建工具来满足更复杂的需求。

三、性能对比:Vue 3 SSR vs SSG

加载时间

SSR (服务器端渲染)

  • 首屏加载时间通常比纯客户端渲染快,因为服务器发送的HTML页面已经包含了渲染好的内容。

  • 对于动态内容丰富的应用,每次用户请求都需要服务器实时渲染页面,这可能导致延迟。

SSG (静态站点生成)

  • 首屏加载时间通常非常快,因为页面是预先生成的静态HTML文件,可以直接从CDN或静态文件服务器快速提供。

  • 对于所有用户,加载时间是一致的,因为每个页面都是预先生成的,没有服务器渲染的延迟。

服务器负载

SSR

  • 服务器负载较高,因为每个页面请求都需要服务器计算和渲染。

  • 对于高流量网站,服务器可能需要更多的资源来处理并发请求,这可能需要更强大的硬件或更多的服务器实例。

SSG

  • 服务器负载较低,因为页面是静态的,服务器只需提供文件即可,不需要额外的渲染计算。

  • 静态文件可以被缓存并分发到全球的CDN节点,进一步减轻原始服务器的负载。

案例说明

假设我们有一个博客网站,我们可以选择使用SSR或SSG来提供内容。以下是两种情况的性能对比案例:

SSR案例

  • 我们使用Nuxt.js(Vue的SSR框架)来构建博客网站。

  • 每当用户访问博客文章时,服务器都会实时渲染页面并提供给用户。

  • 在流量高峰期,服务器可能会遇到性能瓶颈,因为它需要为每个请求渲染页面。

SSG案例

  • 我们使用VuePress来生成博客的静态页面。

  • 所有博客文章在构建阶段就已经生成好了,并被部署到CDN上。

  • 用户访问任何博客文章时,都会从最近的CDN节点快速加载静态内容。

  • 服务器几乎不承受负载,因为所有请求都由CDN处理。

在这个例子中,SSG提供了更快的加载时间和更低的服务器负载。然而,如果博客需要实时更新或显示用户个性化内容,SSR可能是更好的选择,因为它可以提供动态渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户个性化需求和预算等因素。

四、SEO优化:SSR与SSG在搜索引擎优化中的角色

搜索引擎优化(SEO)是网站开发中的一个重要方面,它影响着网站在搜索引擎结果页(SERP)上的排名。SSR和SSG都对SEO有积极影响,但它们的工作方式略有不同。

SSR (服务器端渲染)对SEO的影响

SSR通过在服务器上生成完整的HTML页面,确保了搜索引擎爬虫在抓取网站内容时能够看到完整的页面。这对于SEO非常有利,因为:

  • 完整的内容:爬虫可以立即看到完整的页面内容,包括由JavaScript动态生成的部分。

  • 快速的内容索引:由于内容已经在服务器上渲染,搜索引擎可以更快地索引网站。

  • 提升用户体验:快速的首屏加载时间可以减少跳出率,间接提升SEO排名。

SSG (静态站点生成)对SEO的影响

SSG生成的静态HTML页面同样对SEO友好,因为:

  • 即时可用的内容:静态页面上的内容在部署时就已经是最终形态,无需等待JavaScript执行。

  • 高效的页面加载:静态页面可以快速从CDN加载,提供更好的用户体验。

  • 减少服务器错误:静态页面减少了服务器运行时错误的可能性,这些错误可能会影响SEO。

最佳实践

无论选择SSR还是SSG,以下是一些SEO最佳实践:

  • 元标签和结构化数据:确保所有页面都有适当的</code>、<code><meta name="description"></code>标签以及结构化数据(如Schema.org),以便搜索引擎理解页面内容。</p> </li> <li> <p><strong>内容优先</strong>:在HTML中,内容应该位于前面,而不是被大量的JavaScript或样式代码所覆盖。</p> </li> <li> <p><strong>语义化的HTML标签</strong>:使用正确的HTML标签(如<code><header></code>、<code><footer></code>、<code><article></code>等)来帮助搜索引擎理解页面结构。</p> </li> <li> <p><strong>优化URL结构</strong>:使用清晰、描述性的URL,避免过长或含有大量参数的URL。</p> </li> <li> <p><strong>使用SSL</strong>:确保网站使用HTTPS,这是搜索引擎排名的一个因素。</p> </li> <li> <p><strong>移动友好</strong>:确保网站对移动设备友好,使用响应式设计,并通过Google的移动友好测试。</p> </li> <li> <p><strong>减少重定向</strong>:尽量减少页面重定向,因为它们可能会减慢页面加载速度并影响用户体验。</p> </li> <li> <p><strong>优化图片</strong>:确保所有图片都有<code>alt</code>属性,并对图片进行压缩以减少加载时间。</p> </li> <li> <p><strong>增强内链</strong>:在网站内部合理设置锚文本和链接,以帮助搜索引擎抓取更多页面。</p> </li> <li> <p><strong>监控和分析</strong>:使用工具如Google Search Console和Google Analytics来监控SEO表现,并根据数据进行优化。</p> </li> </ul> <p>通过遵循这些最佳实践,无论是使用SSR还是SSG,都可以提高网站的搜索引擎排名,吸引更多的访问者。</p> <p></p> <h2 id="%E4%BA%94%E3%80%81%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C(UX)%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E8%80%83%E9%87%8F"><strong>五、用户体验(UX):SSR与SSG的考量</strong></h2> <p>用户体验(UX)是指用户在使用产品或服务时的感受和体验。在Web开发中,SSR和SSG对用户体验有着直接的影响,特别是在首屏加载时间和页面交互性方面。</p> <h3 id="%E9%A6%96%E5%B1%8F%E5%8A%A0%E8%BD%BD%E6%97%B6%E9%97%B4">首屏加载时间</h3> <p><strong>SSR (服务器端渲染)</strong>:</p> <ul> <li> <p>SSR可以提供更快的首屏加载时间,因为服务器发送的HTML页面已经包含了渲染好的内容,用户无需等待JavaScript下载和执行即可看到页面。</p> </li> <li> <p>对于需要频繁更新内容的动态网站,SSR可能会导致服务器响应时间增加,特别是在高流量情况下。</p> </li> </ul> <p><strong>SSG (静态站点生成)</strong>:</p> <ul> <li> <p>SSG通常提供最快的首屏加载时间,因为静态文件可以被缓存并通过CDN快速提供,无需服务器端的任何计算。</p> </li> <li> <p>静态页面一旦生成,对于所有用户来说,加载时间是一致的,这提供了稳定的用户体验。</p> </li> </ul> <h3 id="%E4%BA%A4%E4%BA%92%E6%80%A7">交互性</h3> <p><strong>SSR</strong>:</p> <ul> <li> <p>虽然SSR提供了快速的首屏内容,但页面的完全交互性需要等待JavaScript下载、解析和执行完成。</p> </li> <li> <p>如果JavaScript文件很大,或者客户端设备性能较差,这可能会导致用户在可视内容和可交互内容之间感受到延迟。</p> </li> </ul> <p><strong>SSG</strong>:</p> <ul> <li> <p>SSG生成的页面在加载时已经是完全交互的,因为所有的HTML、CSS和JavaScript都是预先加载的。</p> </li> <li> <p>对于包含大量客户端JavaScript逻辑的网站,SSG可能需要额外的客户端代码来处理页面交互,这可能会影响性能。</p> </li> </ul> <h3>案例说明</h3> <p>假设我们有一个电商平台,我们可以选择使用SSR或SSG来提供产品列表。</p> <p><strong>SSR案例</strong>:</p> <ul> <li> <p>我们使用Vue SSR框架(如Nuxt.js)来构建电商平台。</p> </li> <li> <p>当用户访问产品列表页面时,服务器实时渲染页面并提供给用户,用户可以快速看到首屏内容。</p> </li> <li> <p>但是,用户可能需要等待额外的JavaScript加载和执行,才能与页面上的元素(如添加到购物车按钮)进行交互。</p> </li> </ul> <p><strong>SSG案例</strong>:</p> <ul> <li> <p>我们使用Vue SSG工具(如Gridsome)来生成电商平台的静态页面。</p> </li> <li> <p>所有产品列表页面在构建时就已经生成好了,并被部署到CDN上。</p> </li> <li> <p>用户访问产品列表时,页面几乎立即加载,并且可以直接与页面进行交互,因为所有的资源都已经预加载。</p> </li> </ul> <p>在这个例子中,SSG提供了更快的首屏加载时间和即时的页面交互性。然而,如果产品信息需要频繁更新,或者需要根据用户行为动态展示内容,SSR可能是更好的选择,因为它可以提供实时渲染的页面。选择SSR或SSG取决于网站的具体需求,包括内容更新频率、用户交互复杂度和性能优化等因素。</p> <p></p> <h2 id="%E5%85%AD%E3%80%81%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5%EF%BC%9A%E5%9C%A8Vue%203%20SSR%E5%92%8CSSG%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8"><strong>六、缓存策略:在Vue 3 SSR和SSG中的应用</strong></h2> <p>缓存是提高网站性能和用户体验的关键技术。在SSR和SSG中,有效的缓存策略可以显著减少服务器负载,加快内容交付速度,并提高网站的整体性能。</p> <h3 id="SSR%E4%B8%AD%E7%9A%84%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">SSR中的缓存策略</h3> <p>在服务器端渲染(SSR)中,页面是动态生成的,这意味着每次用户请求都需要服务器处理。为了提高性能,可以采用以下缓存策略:</p> <ol> <li> <p><strong>页面级缓存</strong>:对于不经常变化的页面或页面的特定部分,可以在服务器上实现页面级缓存。这样,服务器可以直接返回缓存的HTML,而不是每次都重新渲染。</p> </li> <li> <p><strong>服务端数据缓存</strong>:如果页面依赖于数据库或API的数据,可以在服务器上缓存这些数据。这样,数据检索操作可以从缓存中快速完成,减少数据库查询。</p> </li> <li> <p><strong>CDN缓存</strong>:即使是动态内容,也可以利用CDN的边缘缓存来存储页面的副本。通过设置合适的缓存头(如<code>Cache-Control</code>),可以控制内容在CDN上的缓存时间。</p> </li> <li> <p><strong>客户端缓存</strong>:通过设置HTTP缓存头,可以让浏览器缓存静态资源(如CSS和JavaScript文件),减少后续请求的加载时间。</p> </li> </ol> <h3 id="SSG%E4%B8%AD%E7%9A%84%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">SSG中的缓存策略</h3> <p>在静态站点生成(SSG)中,所有页面在构建时就已经生成,因此缓存策略主要集中在如何高效分发和更新这些静态资源:</p> <ol> <li> <p><strong>CDN全站缓存</strong>:由于页面是静态的,可以将整个网站部署到CDN上,并充分利用CDN缓存来提供快速的全球内容交付。</p> </li> <li> <p><strong>增量构建</strong>:对于大型网站,不需要为每次更新重新生成整个站点。可以使用支持增量构建的SSG工具,只更新改变的部分。</p> </li> <li> <p><strong>浏览器缓存</strong>:为静态资源设置长期的缓存策略,直到资源内容实际发生变化。通常通过在文件名中包含内容哈希(如<code>bundle.abc123.js</code>)来实现。</p> </li> <li> <p><strong>服务工作线程(Service Workers)</strong>:可以使用Service Workers来缓存静态资源和API响应,甚至允许在离线时访问网站。</p> </li> </ol> <h3>案例说明</h3> <p>假设我们运营一个新闻网站,该网站的内容每天更新,但大部分页面结构保持不变。</p> <p><strong>SSR缓存案例</strong>:</p> <ul> <li> <p>我们使用Vue SSR框架(如Nuxt.js)来构建新闻网站。</p> </li> <li> <p>对于首页和文章列表,我们实现了页面级缓存,这些页面每小时更新一次。</p> </li> <li> <p>对于文章内容,我们使用服务端数据缓存来存储从API获取的文章数据,缓存时间设置为15分钟。</p> </li> <li> <p>我们还配置了CDN来缓存静态资源,并设置了合适的<code>Cache-Control</code>头来优化客户端缓存。</p> </li> </ul> <p><strong>SSG缓存案例</strong>:</p> <ul> <li> <p>我们使用Vue SSG工具(如Gridsome)来生成新闻网站的静态页面。</p> </li> <li> <p>整个网站部署在CDN上,所有页面和资源都被缓存,提供快速的内容交付。</p> </li> <li> <p>当新闻更新时,我们只重新生成和部署改变的页面(增量构建)。</p> </li> <li> <p>我们使用Service Workers来缓存静态资源,以便即使在离线时也能访问网站。</p> </li> </ul> <p>在这两个案例中,通过合理的缓存策略,我们能够提供快速的内容加载,同时减少服务器的负载。正确的缓存策略取决于内容的更新频率、用户访问模式和技术栈。</p> <h2></h2> <h2 id="%E4%B8%83%E3%80%81%E6%9E%84%E5%BB%BA%E4%B8%8E%E9%83%A8%E7%BD%B2%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E6%B5%81%E7%A8%8B%E5%B7%AE%E5%BC%82"><strong>七、构建与部署:SSR与SSG的流程差异</strong></h2> <h3 id="SSR%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2">SSR项目的构建和部署</h3> <p><strong>构建过程</strong>:</p> <ol> <li> <p><strong>开发环境设置</strong>:配置Node.js环境,安装依赖,编写服务端渲染逻辑。</p> </li> <li> <p><strong>应用构建</strong>:使用构建工具(如Webpack)打包客户端和服务端资源。</p> </li> <li> <p><strong>服务端渲染</strong>:在服务器上运行Node.js应用,实时渲染页面响应用户请求。</p> </li> </ol> <p><strong>部署过程</strong>:</p> <ol> <li> <p><strong>服务器准备</strong>:设置服务器环境,如安装Node.js和配置反向代理(如Nginx)。</p> </li> <li> <p><strong>持续集成/持续部署(CI/CD)</strong>:配置CI/CD流程自动化测试和部署。</p> </li> <li> <p><strong>应用部署</strong>:将构建好的应用上传到服务器并启动服务。</p> </li> <li> <p><strong>监控和维护</strong>:监控应用性能,确保稳定运行,及时更新和修复问题。</p> </li> </ol> <p><strong>挑战</strong>:</p> <ul> <li> <p><strong>服务器资源管理</strong>:SSR应用可能需要更多的服务器资源,特别是在高流量情况下。</p> </li> <li> <p><strong>复杂的配置</strong>:需要配置服务器环境,管理Node.js进程,处理服务端和客户端的交互。</p> </li> <li> <p><strong>部署复杂性</strong>:实时渲染应用的部署流程可能比静态站点复杂,需要考虑负载均衡、缓存策略等。</p> </li> </ul> <h3 id="SSG%E9%A1%B9%E7%9B%AE%E7%9A%84%E6%9E%84%E5%BB%BA%E5%92%8C%E9%83%A8%E7%BD%B2">SSG项目的构建和部署</h3> <p><strong>构建过程</strong>:</p> <ol> <li> <p><strong>开发环境设置</strong>:配置静态站点生成器(如VuePress或Gridsome),编写Markdown或Vue文件。</p> </li> <li> <p><strong>站点生成</strong>:运行构建命令,生成静态HTML、CSS和JavaScript文件。</p> </li> <li> <p><strong>预览和测试</strong>:在本地或临时服务器上预览生成的站点,进行测试。</p> </li> </ol> <p><strong>部署过程</strong>:</p> <ol> <li> <p><strong>静态资源托管</strong>:选择静态资源托管服务(如Netlify、Vercel或GitHub Pages)。</p> </li> <li> <p><strong>CI/CD配置</strong>:设置自动化构建和部署流程,通常与Git仓库集成。</p> </li> <li> <p><strong>内容部署</strong>:将生成的静态文件上传到托管服务,通常通过CI/CD自动完成。</p> </li> <li> <p><strong>CDN配置</strong>:配置CDN以优化全球内容交付和缓存策略。</p> </li> </ol> <p><strong>挑战</strong>:</p> <ul> <li> <p><strong>内容更新</strong>:对于需要频繁更新的内容,SSG可能需要重新构建和部署整个站点。</p> </li> <li> <p><strong>大型站点构建时间</strong>:大型静态站点的构建时间可能很长,需要优化构建过程。</p> </li> <li> <p><strong>动态功能集成</strong>:静态站点可能需要集成第三方服务或客户端JavaScript来添加动态功能。</p> </li> </ul> <h3>案例说明</h3> <p>假设我们有一个博客网站,我们可以选择使用SSR或SSG来构建和部署。</p> <p><strong>SSR案例</strong>:</p> <ul> <li> <p>我们使用Nuxt.js来构建博客网站,它支持SSR。</p> </li> <li> <p>在本地开发环境中编写应用代码,然后使用Webpack打包资源。</p> </li> <li> <p>配置CI/CD流程,在代码推送到Git仓库时自动运行测试和部署。</p> </li> <li> <p>部署应用到云服务器(如AWS EC2),配置Nginx作为反向代理。</p> </li> <li> <p>面临的挑战包括确保服务器性能以应对可能的流量高峰,以及维护和更新服务器环境。</p> </li> </ul> <p><strong>SSG案例</strong>:</p> <ul> <li> <p>我们选择VuePress作为SSG工具来生成博客的静态页面。</p> </li> <li> <p>在本地环境中编写Markdown内容,运行VuePress构建命令生成静态文件。</p> </li> <li> <p>通过GitHub Actions配置CI/CD,当推送到GitHub仓库时自动构建和部署到GitHub Pages。</p> </li> <li> <p>使用CDN(如Cloudflare)来优化内容交付速度和缓存静态资源。</p> </li> <li> <p>面临的挑战包括管理内容更新导致的频繁构建和优化大型站点的构建时间。</p> </li> </ul> <p>在这两个案例中,SSR提供了更灵活的实时内容更新能力,但需要更多的服务器管理和资源。而SSG提供了更简单的部署流程和更快的加载速度,但对于频繁更新的内容管理可能更具挑战性。</p> <p></p> <h2 id="%E5%85%AB%E3%80%81%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9%E5%A4%84%E7%90%86%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88"><strong>八、动态内容处理:SSR与SSG的解决方案</strong></h2> <p>在SSR(服务器端渲染)和SSG(静态站点生成)的上下文中,处理动态内容通常需要一些策略来确保用户体验的流畅性和内容的实时性。以下是一些处理动态内容的方法:</p> <h3 id="SSR%E4%B8%AD%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">SSR中处理动态内容</h3> <p>在SSR中,服务器在每次请求时动态生成页面,这使得它天然适合处理动态内容。但是,为了提高性能和减少服务器负载,可以采用以下策略:</p> <p><strong>客户端渲染(Hydration)</strong>:</p> <p>在服务器生成的静态标记上,客户端JavaScript接管以添加交互性。</p> <p>动态内容(如用户评论或实时股票价格)可以在客户端通过Ajax请求获取,并在页面上实时更新。</p> <p><strong>缓存策略</strong>:</p> <p>对于不经常变化的内容,可以使用服务器缓存来减少渲染次数。</p> <p>对于经常变化的部分,可以通过设置较短的缓存时间或使用无缓存策略来确保内容的实时性。</p> <h3 id="SSG%E4%B8%AD%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">SSG中处理动态内容</h3> <p>SSG生成的是静态页面,因此处理动态内容通常需要客户端JavaScript或外部服务的帮助:</p> <p><strong>客户端JavaScript</strong>:</p> <p>静态页面加载后,客户端JavaScript可以请求动态内容,并更新DOM。</p> <p>这种方法适用于评论系统、用户个人信息、购物车等需要实时更新的场景。</p> <p><strong>预渲染</strong></p> <p>对于已知会变化但更新频率不高的内容,可以在构建时预渲染。</p> <p>例如,可以在每天的特定时间运行构建过程,以更新新闻文章或博客帖子。</p> <p><strong>第三方服务</strong>:</p> <p>可以集成第三方服务(如Disqus评论系统或Firebase实时数据库)来处理动态内容。</p> <p>这些服务通常提供API和客户端库,可以轻松集成到静态页面中。</p> <h3>案例说明</h3> <p><strong>SSR案例</strong>: 假设我们有一个电商网站,需要显示最新的产品信息和价格。</p> <ul> <li> <p>使用Nuxt.js进行SSR,服务器为每个产品页面提供最新的信息。</p> </li> <li> <p>对于产品价格,由于它可能会频繁变动,我们在客户端使用JavaScript请求最新价格,并在页面上动态更新。</p> </li> <li> <p>对于产品描述等相对静态的内容,我们可以在服务器端渲染并缓存以提高性能。</p> </li> </ul> <p><strong>SSG案例</strong>: 假设我们有一个新闻网站,新闻文章每天更新,但评论部分是实时的。</p> <ul> <li> <p>使用VuePress生成静态新闻文章页面。</p> </li> <li> <p>对于评论部分,我们在客户端使用JavaScript集成第三方评论服务(如Disqus),允许用户实时发布和查看评论。</p> </li> <li> <p>我们可以设置一个定时任务(如GitHub Actions workflow),每天自动运行构建过程以更新新闻内容。</p> </li> </ul> <p>在这两个案例中,SSR和SSG都能够有效地处理动态内容。SSR通过服务器端的实时渲染提供最新内容,而SSG则依赖客户端JavaScript和第三方服务来添加动态功能。选择哪种方法取决于项目的需求、内容更新频率以及对实时性的要求。</p> <p></p> <h2 id="%E4%B9%9D%E3%80%81%E5%AE%89%E5%85%A8%E6%80%A7%E8%80%83%E8%99%91%EF%BC%9ASSR%E4%B8%8ESSG%E7%9A%84%E5%AE%89%E5%85%A8%E9%9A%90%E6%82%A3%E5%8F%8A%E9%98%B2%E6%8A%A4"><strong>九、安全性考虑:SSR与SSG的安全隐患及防护</strong></h2> <p>在Web开发中,无论是服务器端渲染(SSR)还是静态站点生成(SSG),都需要考虑潜在的安全问题。以下是一些常见的安全问题及其防护措施:</p> <h3 id="SSR%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">SSR的安全问题</h3> <ol> <li> <p><strong>跨站脚本攻击(XSS)</strong>:</p> <ul> <li> <p>由于SSR涉及动态生成HTML内容,如果不正确地处理用户输入,攻击者可能注入恶意脚本。</p> </li> <li> <p><strong>防护措施</strong>:对所有用户输入进行适当的转义和清理,使用模板引擎自带的XSS防护功能。</p> </li> </ul></li> <li> <p><strong>代码注入</strong>:</p> <ul> <li> <p>如果服务器端脚本不安全,攻击者可能通过注入恶意代码来执行未授权的操作。</p> </li> <li> <p><strong>防护措施</strong>:使用安全的编码实践,避免执行用户提供的代码片段,使用参数化查询防止SQL注入。</p> </li> </ul></li> <li> <p><strong>服务器配置错误</strong>:</p> <ul> <li> <p>不当的服务器配置可能导致敏感信息泄露或未授权访问。</p> </li> <li> <p><strong>防护措施</strong>:确保服务器和应用程序的配置是安全的,定期进行安全审计。</p> </li> </ul></li> </ol> <h3 id="SSG%E7%9A%84%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">SSG的安全问题</h3> <ol> <li> <p><strong>第三方依赖漏洞</strong>:</p> <ul> <li> <p>SSG通常依赖于大量的第三方库和插件,这些可能包含安全漏洞。</p> </li> <li> <p><strong>防护措施</strong>:定期更新依赖库,使用安全扫描工具检测已知漏洞。</p> </li> </ul></li> <li> <p><strong>内容劫持</strong>:</p> <ul> <li> <p>静态文件如果在传输过程中被劫持,可能会被篡改或用于恶意目的。</p> </li> <li> <p><strong>防护措施</strong>:使用HTTPS加密所有传输,确保内容的完整性。</p> </li> </ul></li> <li> <p><strong>第三方服务安全</strong>:</p> <ul> <li> <p>集成的第三方服务(如评论系统)可能成为攻击的途径。</p> </li> <li> <p><strong>防护措施</strong>:选择信誉良好的第三方服务提供商,定期审查集成代码。</p> </li> </ul></li> </ol> <h3 id="%E9%98%B2%E6%8A%A4%E6%8E%AA%E6%96%BD%E7%9A%84%E6%A1%88%E4%BE%8B%E8%AF%B4%E6%98%8E">防护措施的案例说明</h3> <p><strong>SSR案例</strong>: 假设我们运营一个论坛网站,用户可以发布和评论帖子。</p> <ul> <li> <p><strong>XSS防护</strong>:使用Vue.js或React等现代前端框架,它们默认对数据绑定进行转义,减少XSS风险。</p> </li> <li> <p><strong>代码注入防护</strong>:使用ORM库(如Sequelize或TypeORM)来处理数据库操作,避免直接拼接SQL语句,防止SQL注入攻击。</p> </li> <li> <p><strong>服务器配置</strong>:配置安全的HTTP头部(如Content Security Policy),限制资源加载来源,使用Nginx或Apache的安全配置模板。</p> </li> </ul> <p><strong>SSG案例</strong>: 假设我们有一个公司介绍网站,主要提供公司信息和联系方式。</p> <ul> <li> <p><strong>依赖漏洞防护</strong>:定期运行<code>npm audit</code>或<code>yarn audit</code>来检查项目依赖的安全性,并及时应用更新。</p> </li> <li> <p><strong>内容劫持防护</strong>:使用Let’s Encrypt提供的免费SSL证书启用HTTPS,确保所有内容通过加密通道传输。</p> </li> <li> <p><strong>第三方服务安全</strong>:如果网站包含联系表单,使用可靠的表单处理服务(如Formspree或Netlify Forms),并启用验证码防止自动化垃圾邮件。</p> </li> </ul> <p>在这两个案例中,通过采取适当的安全措施,可以显著降低安全风险。SSR和SSG都需要持续的安全意识和定期的安全维护来保护网站免受攻击。</p> <h2 id="%E5%8D%81%E3%80%81%E6%80%BB%E7%BB%93">十、总结</h2> <p>在本次讨论中,我们探讨了服务器端渲染(SSR)和静态站点生成(SSG)在用户体验、缓存策略、构建与部署、处理动态内容以及安全问题方面的影响和方法。</p> <h3 id="%E7%94%A8%E6%88%B7%E4%BD%93%E9%AA%8C">用户体验</h3> <ol> <li>SSR可以提供更快的首屏加载时间,但可能需要等待JavaScript加载完成后才能进行完全交互。</li> <li>SSG提供最快的首屏加载时间和即时交互性,因为静态资源可以通过CDN快速提供。</li> </ol> <h3 id="%E7%BC%93%E5%AD%98%E7%AD%96%E7%95%A5">缓存策略</h3> <ol> <li> <p>SSR中的缓存策略包括页面级缓存、服务端数据缓存、CDN缓存和客户端缓存。</p> </li> <li> <p>SSG中的缓存策略主要依赖于CDN全站缓存、增量构建、浏览器缓存和Service Workers。</p> </li> </ol> <h3 id="%E6%9E%84%E5%BB%BA%E4%B8%8E%E9%83%A8%E7%BD%B2">构建与部署</h3> <ol> <li> <p>SSR的构建和部署涉及服务器资源管理、复杂的配置和部署流程。</p> </li> <li> <p>SSG的构建和部署通常更简单,但需要管理内容更新和优化大型站点的构建时间。</p> </li> </ol> <h3 id="%E5%A4%84%E7%90%86%E5%8A%A8%E6%80%81%E5%86%85%E5%AE%B9">处理动态内容</h3> <ol> <li> <p>SR天然适合处理动态内容,可以通过客户端渲染和缓存策略来优化性能。</p> </li> <li> <p>SSG处理动态内容通常依赖于客户端JavaScript、预渲染和第三方服务。</p> </li> </ol> <h3 id="%E5%AE%89%E5%85%A8%E9%97%AE%E9%A2%98">安全问题</h3> <ol> <li> <p>面临的安全问题包括XSS、代码注入和服务器配置错误,需要采取相应的防护措施。</p> </li> <li> <p>SSG的安全问题涉及第三方依赖漏洞、内容劫持和第三方服务安全,也需要适当的安全措施。</p> </li> </ol> <p><strong>总的来说,SSR和SSG各有优势和挑战。选择哪一种技术取决于项目的具体需求,如内容更新频率、用户交互复杂度、性能优化需求和安全考虑。通过合理的缓存策略、构建和部署流程、动态内容处理方法以及安全措施,可以最大化地提升用户体验和网站性能。</strong></p> <p></p> <blockquote> <p>若阁下觉此文有益,恳请施以<span style="color:#fe2c24;">-<strong>点赞</strong> ⭐ - <strong>收藏</strong>  - <strong>关注</strong></span>之礼,以资鼓励。倘若有疑问或建言,亦请在评论区<span style="color:#fe2c24;"><strong>评论</strong></span> 赐教,吾将感激不尽。</p> </blockquote> </div> </div>�������������������������������������������� </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1738935086948081664"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(vue.js,前端,javascript,经验分享,typescript,vue,vue进阶)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1773604712738783232.htm" title="android 自定义曲线图,Android自定义View——贝赛尔曲线" target="_blank">android 自定义曲线图,Android自定义View——贝赛尔曲线</a> <span class="text-muted">weixin_39767513</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%9B%B2%E7%BA%BF%E5%9B%BE/1.htm">自定义曲线图</a> <div>个人博客:haichenyi.com。感谢关注本文针对有一定自定义View的童鞋,最好对贝赛尔曲线有辣么一丢丢了解,不了解也没关系。花5分钟看一下GcsSloop的安卓自定义View进阶-Path之贝塞尔曲线。本文的最终效果图:最终效果图.gif思路首先他是一个只有上半部分的正弦形状的水波纹,很规则。其次,他这个正弦图左右在移动。然后,就是它这个自定义View,上下也在移动,是慢慢增加的最后,优化</div> </li> <li><a href="/article/1773528105273589760.htm" title="v-for 实例" target="_blank">v-for 实例</a> <span class="text-muted">琪33</span> <div>v-for实例v-for实例{{item}}{{index+1}}:{{student.name}}-{{student.age}}varapp=newVue({el:'#app',data:{items:[53,23,76,14,54,36,28],students:[{name:'jspang',age:32},{name:'Panda',age:30},{name:'PanPaN',age:</div> </li> <li><a href="/article/1773515340869861376.htm" title="npm 搭建 Vite 项目" target="_blank">npm 搭建 Vite 项目</a> <span class="text-muted">渺小的虫子</span> <a class="tag" taget="_blank" href="/search/viter/1.htm">viter</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>兼容性注意Vite需要Node.js版本>=12.0.0。1、使用npm安装Viter$npminitvite@latest使用npm初始化项目#npm6.xnpminitvite@latestmy-vue-app--templatevue#npm7+,需要额外的双横线:npminitvite@latestmy-vue-app----templatevue2、配置路由:npminstallvue-</div> </li> <li><a href="/article/1773504513622212608.htm" title="大前端-postcss安装使用指南" target="_blank">大前端-postcss安装使用指南</a> <span class="text-muted">黑夜照亮前行的路</span> <a class="tag" taget="_blank" href="/search/postcss/1.htm">postcss</a> <div>PostCSS是一款强大的CSS处理工具,可以用来自动添加浏览器前缀、代码合并、代码压缩等,提升代码的可读性,并支持使用最新的CSS语法。以下是一份简化的PostCSS安装使用指南:一、安装PostCSS在你的项目目录中,通过npm(NodePackageManager)来安装PostCSS。打开命令行窗口,输入以下命令:bash复制代码npminstallpostcss--save-dev这将把</div> </li> <li><a href="/article/1773504261557125120.htm" title="谷歌浏览器驱动Chromedriver(114-120版本)文件以及驱动下载教程" target="_blank">谷歌浏览器驱动Chromedriver(114-120版本)文件以及驱动下载教程</a> <span class="text-muted">pigerr杨</span> <a class="tag" taget="_blank" href="/search/Python/1.htm">Python</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/chrome/1.htm">chrome</a><a class="tag" taget="_blank" href="/search/drivers/1.htm">drivers</a> <div>ChromeDriver官方网站GitHub||GoogleChromeLabs/chrome-for-testingChromeDriver113-125_JSONChromeforTestingavailability123-125zip白月黑羽Python基础|进阶|Qt图形界面|Django|自动化测试|性能测试|JS语言|JS前端|原理与安装</div> </li> <li><a href="/article/1773501994674225152.htm" title="虚拟 DOM 的优缺点有哪些" target="_blank">虚拟 DOM 的优缺点有哪些</a> <span class="text-muted">咕噜签名分发</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>虚拟DOM(VirtualDOM)技术作为现代前端开发中的重要组成部分,已经成为了众多流行前端框架的核心特性。它的引入为前端开发带来了诸多优势,同时也需要我们认真思考其潜在的考量。下面简单的介绍一下虚拟DOM技术的优势与缺点,深入探讨其在实际应用中的影响。提升性能虚拟DOM的最大优势之一是提升页面性能。通过比较前后两次虚拟DOM树的差异,最小化实际DOM操作,从而减少页面重渲染时的性能消耗。这种优</div> </li> <li><a href="/article/1773499853914046464.htm" title="vue 通信方式" target="_blank">vue 通信方式</a> <span class="text-muted">hx_1199</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>1、props和$emit父组件向子组件传递数据是通过props传递的,子组件传递给父组件是通过$emit触发事件来做到的。父组件this.$emit("update:page",newVal)-->importChildfrom'./child'exportdefault{name:"Father",components:{Child,},data(){return{articleList:['</div> </li> <li><a href="/article/1773495574226599936.htm" title="3、JavaWeb-Ajax/Axios-前端工程化-Element" target="_blank">3、JavaWeb-Ajax/Axios-前端工程化-Element</a> <span class="text-muted">所谓远行Misnearch</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/JavaWeb/1.htm">JavaWeb</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a><a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>P34Ajax介绍Ajax:AsynchroousJavaScriptAndXML,异步的JS和XMLJS网页动作,XML一种标记语言,存储数据,作用:数据交换:通过Ajax给服务器发送请求,并获取服务器响应的数据异步交互:在不重新加载整个页面的情况下,与服务器交换数据并实现更新部分网页的技术,例如:搜索联想、用户名是否可用的校验等等。同步与异步:同步:服务器在处理中客户端要处于等待状态,输入域名</div> </li> <li><a href="/article/1773403175781466112.htm" title="Python dict字符串转json对象,小数精度丢失问题" target="_blank">Python dict字符串转json对象,小数精度丢失问题</a> <span class="text-muted">朝如青丝 暮成雪</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>一前言JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,dict是Python的一种数据格式。本篇介绍一个float数据转换时精度丢失的案例。二问题描述importjsontest_str1='{"π":3.1415926535897932384626433832795028841971}'test_str2='{"value":10.00000}'print</div> </li> <li><a href="/article/1773389331080216576.htm" title="VUE 页面禁止缩放(华为平板浏览器可能失效)" target="_blank">VUE 页面禁止缩放(华为平板浏览器可能失效)</a> <span class="text-muted">唐屁屁儿</span> <a class="tag" taget="_blank" href="/search/JS/1.htm">JS</a><a class="tag" taget="_blank" href="/search/vue/1.htm">vue</a><a class="tag" taget="_blank" href="/search/webview/1.htm">webview</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>h5页面移动端禁止缩放、web页面禁止浏览器缩放移动端优先,可禁止用户缩放和双击放大;在App.vue中的script内的方法里加入以下代码:window.onload=function(){document.addEventListener('touchstart',function(event){if(event.touches.length>1){event.preventDefault()</div> </li> <li><a href="/article/1773382031552610304.htm" title="java实体中返回前端的double类型四舍五入(格式化)" target="_blank">java实体中返回前端的double类型四舍五入(格式化)</a> <span class="text-muted">婲落ヽ紅顏誶</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>根据业务,需要通过后端给前端返回部分double类型的数值,一般需要保留两位小数,使用jackson转换对象packagecom.ruoyi.common.core.config;importcom.fasterxml.jackson.core.JsonGenerator;importcom.fasterxml.jackson.databind.JsonSerializer;importcom.f</div> </li> <li><a href="/article/1773360885226602496.htm" title="Django forms组件" target="_blank">Django forms组件</a> <span class="text-muted">在飞行-米龙</span> <a class="tag" taget="_blank" href="/search/Django/1.htm">Django</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>【一】引入【1】实现登陆验证功能(1)需求分析登陆验证需要前后端交互,采用form表单提交数据对数据进行校验用户名必须以英文大写字母开头密码必须大于三位数反馈给用户错误的信息除了反馈错误的信息还有保留原始输入内容(2)后端代码使用user_info_dict字典每次刷新存储存储前端发送的信息存储后端进行验证的信息defhome(request):#每次后刷新这个信息字典user_info_dict</div> </li> <li><a href="/article/1773347920293199872.htm" title="Vue 常见面试题(一)" target="_blank">Vue 常见面试题(一)</a> <span class="text-muted">安生生申</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98/1.htm">面试题</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>目录1、Vue的最大的优势是什么?(必会)2、Vue和jQuery两者之间的区别是什么?(必会)3、MVVM和MVC区别是什么?哪些场景适合?(必会)1、基本定义2、使用场景3、两者之间的区别4、Vue数据双向绑定的原理是什么?(必会)5、Object.defineProperty和Proxy的区别(必会)6、Vue生命周期总共分为几个阶段?(必会)7、第一次加载页面会触发哪几个钩子函数?(必会)</div> </li> <li><a href="/article/1773308900838277120.htm" title="Web前端Html的表单" target="_blank">Web前端Html的表单</a> <span class="text-muted">任家伟</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div>表单的关键字:form标签表示一个表单区域action=“后端地址”method=“提交数据方式:get/post”input单行输入框type=“text”文本name=“定义名称名字自定义”向后端提交的键readonly=“readonly”只读,不可修改,但是可以提交disabled=“disabled”禁用组件不可修改,不能提交type=“password”密码框type=“radio”单</div> </li> <li><a href="/article/1773279695408791552.htm" title="Thinkphp - 详细实现网站系统登录功能,附带 Mysql 数据库设置、Web 前端展示界面、信息校验等(详细代码,即设计过程)" target="_blank">Thinkphp - 详细实现网站系统登录功能,附带 Mysql 数据库设置、Web 前端展示界面、信息校验等(详细代码,即设计过程)</a> <span class="text-muted">王佳斌</span> <a class="tag" taget="_blank" href="/search/%2B/1.htm">+</a><a class="tag" taget="_blank" href="/search/Thinkphp/1.htm">Thinkphp</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>前言登录功能,是我们几乎开发每个系统都必须的模块。登录功能设计思路,主要包括几个方面。用户输入网址展示登录页面用户输入用户名,密码等点击登录进行信息校验校验通过之后,记录用户登录信息,跳转指定页面用户校验失败,提示失败信息页面目录具体功能实现为了快速搭建可用、美观的页面,我们采用一个比较成熟的前端框架Bootstrap。下面我们到Bootstrap的官网Bootsrap官网下载bootstrap。</div> </li> <li><a href="/article/1773256158274977792.htm" title="javascript 日期转换为时间戳,时间戳转换为日期的函数" target="_blank">javascript 日期转换为时间戳,时间戳转换为日期的函数</a> <span class="text-muted">cdcdhj</span> <a class="tag" taget="_blank" href="/search/javascript%E5%AD%A6%E4%B9%A0%E6%97%A5%E8%AE%B0/1.htm">javascript学习日记</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>日期转化为时间戳,主要用valueOf()来进行转化为毫秒时间戳,getTime()IOS系统无法解析转换,所以都有valueOf()letgetTimestampOrDate=function(timestamp){lettimeStamp='';constregex=/^\d{4}(-|\/)\d{2}(-|\/)\d{2}$/;constregex2=/^\d{4}(-|\/)\d{2}(-</div> </li> <li><a href="/article/1773240552423227392.htm" title="react native 总结" target="_blank">react native 总结</a> <span class="text-muted">一切顺势而行</span> <a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>reactapp.js相当与vueapp.vueimportReactfrom'react';import'./App.css';importReactRoutefrom'./router'import{HashRouterasRouter,Link}from'react-router-dom'classAppextendsReact.Component{constructor(props){su</div> </li> <li><a href="/article/1773230859613175808.htm" title="Vue 模版编译原理" target="_blank">Vue 模版编译原理</a> <span class="text-muted">I will.874</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>当我们使用Vue编写完一个组件以后,Vue会根据模版编译一个render函数,调用render函数生成虚拟DOM,然后将虚拟DOM映射成真实DOM当数据发生变化时,Vue会触发更新视图,调用render函数返回新的虚拟DOM,对比新旧虚拟DOM,修改真实DOM,从而更新页面在此期间,有以下4个关键步骤:模版编译。生成渲染函数render执行render函数生成虚拟DOM首次渲染,根据虚拟DOM生成</div> </li> <li><a href="/article/1773212227294265344.htm" title="reactive和ref的异同、toRef和toRefs的使用" target="_blank">reactive和ref的异同、toRef和toRefs的使用</a> <span class="text-muted">Niucode</span> <a class="tag" taget="_blank" href="/search/vue3/1.htm">vue3</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>一、reactive和ref有了reactive为什么还要ref?ref处理起基本数据类型来更加的方便快捷,性能要更好。ref内部值的变化只会触发订阅它的副作用函数(effect)更新,而reactive(Proxy)内部对象的任何属性变化都会触发整个对象的重新渲染。相同点:都是Vue3提供的用于创建响应式数据的函数;在组件中都能够触发视图更新,实现数据的双向绑定。不同点:数据类型:reactiv</div> </li> <li><a href="/article/1773198631940194304.htm" title="COMP315 JavaScript Cloud Computing for E Commerce" target="_blank">COMP315 JavaScript Cloud Computing for E Commerce</a> <span class="text-muted">zhuyu0206girl</span> <a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/ecmascript/1.htm">ecmascript</a> <div>Assignment1:Javascript1IntroductionAcommontaskincloudcomputingisdatacleaning,whichistheprocessoftakinganinitialdatasetthatmaycontainerroneousorincompletedata,andremovingorfixingthoseelementsbeforeform</div> </li> <li><a href="/article/1773191331473063936.htm" title="JSON与AJAX:网页交互的利器" target="_blank">JSON与AJAX:网页交互的利器</a> <span class="text-muted">入冉心</span> <a class="tag" taget="_blank" href="/search/json/1.htm">json</a><a class="tag" taget="_blank" href="/search/ajax/1.htm">ajax</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>在现代Web开发中,JSON(JavaScriptObjectNotation)和AJAX(AsynchronousJavaScriptandXML)是两项不可或缺的技术。它们共同为网页提供了动态、实时的数据交互能力,为用户带来了更加流畅和丰富的体验。本文将详细介绍JSON和AJAX的概念、原理,并通过代码示例展示它们在实际开发中的应用。一、JSON:轻量级的数据交换格式JSON是一种轻量级的数据</div> </li> <li><a href="/article/1772795036136701952.htm" title="程序员开发技术整理" target="_blank">程序员开发技术整理</a> <span class="text-muted">laizhixue</span> <a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E6%A1%86%E6%9E%B6/1.htm">前端框架</a> <div>前端技术:vue-前端框架element-前端框架bootstrap-前端框架echarts-图标组件C#后端技术:webservice:soap架构:简单的通信协议,用于服务通信ORM框架:对象关系映射,如EF:对象实体模型,是ado.net中的应用技术soap服务通讯:xml通讯ado.net:OAuth2:登录授权认证:Token认证:JWT:jsonwebtokenJava后端技术:便捷工</div> </li> <li><a href="/article/1772773132000624640.htm" title="【前端学习——js篇】7.函数缓存" target="_blank">【前端学习——js篇】7.函数缓存</a> <span class="text-muted">笔下无竹墨下有鱼</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF%E5%AD%A6%E4%B9%A0/1.htm">前端学习</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>具体见:https://github.com/febobo/web-interview7.函数缓存函数缓存,就是将函数运算过的结果进行缓存本质上就是用空间(缓存存储)换时间(计算过程)常用于缓存数据计算结果和缓存对象。其实现主要通过闭包、柯里化和高阶函数。下面主要介绍下柯里化:①柯里化柯里化(currying)是一种函数式编程的概念,指的是将一个带有多个参数的函数转换成一系列只接受一个参数的函数的</div> </li> <li><a href="/article/1772738346825613312.htm" title="javascript的数据类型及转换" target="_blank">javascript的数据类型及转换</a> <span class="text-muted">田小田txt</span> <div>一、JavaScript数据类型:共有string,number,boolean,object,function五种数据类型;其中Object,Date,Array为对象型;2个不包含任何值的数据类型:null,undefined。二、Typeof查看数据类型:typeof"John"//返回stringtypeof3.14//返回numbertypeofNaN//返回numbertypeoffa</div> </li> <li><a href="/article/1772693579618123776.htm" title="C++进阶学习(3)类类型转换" target="_blank">C++进阶学习(3)类类型转换</a> <span class="text-muted">一只特立独行猪</span> <a class="tag" taget="_blank" href="/search/C%2B%2B%E7%9A%84%E5%AD%A6%E4%B9%A0/1.htm">C++的学习</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>文章目录一、类类型转换1.构造函数构造2.类型转换函数一、类类型转换数据类型转换在程序编译时或在程序运行实现基本类型←→基本类型基本类型←→类类型类类型←→类类型类对象的类型转换可由两种方式说明:构造函数转换函数称为用户定义的类型转换或类类型转换,有隐式调用和显式调用方式1.构造函数构造当类ClassX具有以下形式的构造函数:说明了一种从参数arg的类型到该类类型的转换ClassX::ClassX</div> </li> <li><a href="/article/1772690431591645184.htm" title="C++ 如何去认识模板" target="_blank">C++ 如何去认识模板</a> <span class="text-muted">SuhyOvO</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>引言:C++模板是泛型编程的基石,允许程序员定义可与任何数据类型协作的函数和类。这种机制极大地增加了代码的灵活性和复用性,是C++最强大的特性之一。本文将深入探讨C++模板的概念、优势以及使用方法,帮助读者掌握这一重要的编程工具。文章目录模板简介模板的优势一、模板基础1.1模板的概念1.2函数模板1.3类模板二、模板进阶2.1模板的实例化2.2模板的特化2.3模板的默认参数2.4模板的嵌套三、模板</div> </li> <li><a href="/article/1772673815097180160.htm" title="Websocket服务监听收发消息" target="_blank">Websocket服务监听收发消息</a> <span class="text-muted">beiback</span> <a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%97%AE%E9%A2%98/1.htm">服务器问题</a><a class="tag" taget="_blank" href="/search/websocket/1.htm">websocket</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a> <div>目录1.pom依赖坐标2.项目配置端口和项目包名2.创建处理器3.注册处理器4.前端页面1.pom依赖坐标org.springframework.bootspring-boot-starter-websocket2.项目配置端口和项目包名application.propertiesserver.port=8088//路径规范:为应用的所有servlet提供一个统一的前缀,使URL结构更加清晰和一致</div> </li> <li><a href="/article/1772673816238030848.htm" title="Netty服务器结合WebSocke协议监听和接收数据" target="_blank">Netty服务器结合WebSocke协议监听和接收数据</a> <span class="text-muted">beiback</span> <a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8%E9%97%AE%E9%A2%98/1.htm">服务器问题</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a> <div>目录1.pom依赖2.配置属性3.创建netty服务器4.建立监听和响应5.创建启动器6.前端static下页面7.前端js8.注意异常问题9.创建netty服务器--使用守护线程1.pom依赖io.nettynetty-all4.1.86.Final2.配置属性application.properties#启动端口server.port=8088server.servlet.context-pa</div> </li> <li><a href="/article/1772654174425645056.htm" title="基于SSM+Vue企业销售培训系统 企业人才培训系统 企业课程培训管理系统 企业文化培训班系统Java" target="_blank">基于SSM+Vue企业销售培训系统 企业人才培训系统 企业课程培训管理系统 企业文化培训班系统Java</a> <span class="text-muted">计算机程序老哥</span> <div>作者主页:计算机毕业设计老哥有问题可以主页问我一、开发介绍1.1开发环境开发语言:Java数据库:MySQL系统架构:B/S后端:SSM(Spring+SpringMVC+Mybatis)前端:Vue工具:IDEA或者Eclipse,JDK1.8,Maven二、系统介绍2.1图片展示注册登录页面:登陆.png前端页面功能:首页、培训班、在线学习、企业文化、交流论坛、试卷列表、系统公告、留言反馈、个</div> </li> <li><a href="/article/1772646499772071936.htm" title="stable diffusion 提示词进阶语法-学习小结" target="_blank">stable diffusion 提示词进阶语法-学习小结</a> <span class="text-muted">DTcode7</span> <a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/stable/1.htm">stable</a><a class="tag" taget="_blank" href="/search/diffusion/1.htm">diffusion</a><a class="tag" taget="_blank" href="/search/%E6%8F%90%E7%A4%BA%E8%AF%8D/1.htm">提示词</a><a class="tag" taget="_blank" href="/search/%E8%BF%9B%E9%98%B6%E8%AF%AD%E6%B3%95/1.htm">进阶语法</a> <div>stablediffusion提示词进阶语法前言提示词语法基础正向提示词基础负面提示词可选正向提示词(特写镜头提示词)进阶语法1——提示词注释进阶语法2——and连接词进阶语法3——BREAK阻断前言AI绘画大家应该都有所接触了吧,mj、sd各有各的好处,俺滴钱包说暂时不支持去买mj账号,所以就先用sd来跑图啦~如果你还没有sd,那就快来看看这位赛博菩萨的启动器吧~博客地址:stablediffu</div> </li> <li><a href="/article/113.htm" title="windows下源码安装golang" target="_blank">windows下源码安装golang</a> <span class="text-muted">616050468</span> <a class="tag" taget="_blank" href="/search/golang%E5%AE%89%E8%A3%85/1.htm">golang安装</a><a class="tag" taget="_blank" href="/search/golang%E7%8E%AF%E5%A2%83/1.htm">golang环境</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a> <div>         系统: 64位win7, 开发环境:sublime text 2,  go版本: 1.4.1    1.  安装前准备(gcc, gdb, git)        golang在64位系</div> </li> <li><a href="/article/240.htm" title="redis批量删除带空格的key" target="_blank">redis批量删除带空格的key</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>redis批量删除的通常做法: redis-cli keys "blacklist*" | xargs redis-cli del 上面的命令在key的前后没有空格时是可以的,但有空格就不行了: $redis-cli keys "blacklist*" 1) "blacklist:12: 361942420@qq.com</div> </li> <li><a href="/article/367.htm" title="oracle正则表达式的用法" target="_blank">oracle正则表达式的用法</a> <span class="text-muted">0624chenhong</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1.htm">正则表达式</a> <div>  方括号表达示 方括号表达式 描述 [[:alnum:]] 字母和数字混合的字符 [[:alpha:]] 字母字符 [[:cntrl:]] 控制字符 [[:digit:]] 数字字符 [[:graph:]] 图像字符 [[:lower:]] 小写字母字符 [[:print:]] 打印字符 [[:punct:]] 标点符号字符 [[:space:]]</div> </li> <li><a href="/article/494.htm" title="2048源码(核心算法有,缺少几个anctionbar,以后补上)" target="_blank">2048源码(核心算法有,缺少几个anctionbar,以后补上)</a> <span class="text-muted">不懂事的小屁孩</span> <a class="tag" taget="_blank" href="/search/2048/1.htm">2048</a> <div>2048游戏基本上有四部分组成, 1:主activity,包含游戏块的16个方格,上面统计分数的模块 2:底下的gridview,监听上下左右的滑动,进行事件处理, 3:每一个卡片,里面的内容很简单,只有一个text,记录显示的数字 4:Actionbar,是游戏用重新开始,设置等功能(这个在底下可以下载的代码里面还没有实现) 写代码的流程 1:设计游戏的布局,基本是两块,上面是分</div> </li> <li><a href="/article/621.htm" title="jquery内部链式调用机理" target="_blank">jquery内部链式调用机理</a> <span class="text-muted">换个号韩国红果果</span> <a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>只需要在调用该对象合适(比如下列的setStyles)的方法后让该方法返回该对象(通过this  因为一旦一个函数称为一个对象方法的话那么在这个方法内部this(结合下面的setStyles)指向这个对象) function create(type){ var element=document.createElement(type); //this=element; </div> </li> <li><a href="/article/748.htm" title="你订酒店时的每一次点击 背后都是NoSQL和云计算" target="_blank">你订酒店时的每一次点击 背后都是NoSQL和云计算</a> <span class="text-muted">蓝儿唯美</span> <a class="tag" taget="_blank" href="/search/NoSQL/1.htm">NoSQL</a> <div>全球最大的在线旅游公司Expedia旗下的酒店预订公司,它运营着89个网站,跨越68个国家,三年前开始实验公有云,以求让客户在预订网站上查询假期酒店时得到更快的信息获取体验。 云端本身是用于驱动网站的部分小功能的,如搜索框的自动推荐功能,还能保证处理Hotels.com服务的季节性需求高峰整体储能。 Hotels.com的首席技术官Thierry Bedos上个月在伦敦参加“2015 Clou</div> </li> <li><a href="/article/875.htm" title="java笔记1" target="_blank">java笔记1</a> <span class="text-muted">a-john</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1,面向对象程序设计(Object-oriented Propramming,OOP):java就是一种面向对象程序设计。 2,对象:我们将问题空间中的元素及其在解空间中的表示称为“对象”。简单来说,对象是某个类型的实例。比如狗是一个类型,哈士奇可以是狗的一个实例,也就是对象。 3,面向对象程序设计方式的特性:     3.1 万物皆为对象。    </div> </li> <li><a href="/article/1002.htm" title="C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)" target="_blank">C语言 sizeof和strlen之间的那些事 C/C++软件开发求职面试题 必备考点(一)</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/C%2FC%2B%2B%E6%B1%82%E8%81%8C%E9%9D%A2%E8%AF%95%E5%BF%85%E5%A4%87%E8%80%83%E7%82%B9/1.htm">C/C++求职面试必备考点</a> <div>        找工作在即,以后决定每天至少写一个知识点,主要是记录,逼迫自己动手、总结加深印象。当然如果能有一言半语让他人收益,后学幸运之至也。如有错误,还希望大家帮忙指出来。感激不尽。        后学保证每个写出来的结果都是自己在电脑上亲自跑过的,咱人笨,以前学的也半吊子。很多时候只能靠运行出来的结果再反过来</div> </li> <li><a href="/article/1129.htm" title="程序员写代码时就不要管需求了吗?" target="_blank">程序员写代码时就不要管需求了吗?</a> <span class="text-muted">asia007</span> <a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98%E4%B8%8D%E8%83%BD%E4%B8%80%E5%91%B3%E8%B7%9F%E9%9C%80%E6%B1%82%E8%B5%B0/1.htm">程序员不能一味跟需求走</a> <div>      编程也有2年了,刚开始不懂的什么都跟需求走,需求是怎样就用代码实现就行,也不管这个需求是否合理,是否为较好的用户体验。当然刚开始编程都会这样,但是如果有了2年以上的工作经验的程序员只知道一味写代码,而不在写的过程中思考一下这个需求是否合理,那么,我想这个程序员就只能一辈写敲敲代码了。       我的技术不是很好,但是就不代</div> </li> <li><a href="/article/1256.htm" title="Activity的四种启动模式" target="_blank">Activity的四种启动模式</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">栈模式启动</a><a class="tag" taget="_blank" href="/search/Activity%E7%9A%84%E6%A0%87%E5%87%86%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">Activity的标准模式启动</a><a class="tag" taget="_blank" href="/search/%E6%A0%88%E9%A1%B6%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">栈顶模式启动</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F%E5%90%AF%E5%8A%A8/1.htm">单例模式启动</a> <div>android界面的操作就是很多个activity之间的切换,启动模式决定启动的activity的生命周期 ;   启动模式xml中配置     <activity android:name=".MainActivity" android:launchMode="standard&quo</div> </li> <li><a href="/article/1383.htm" title="Spring中@Autowired标签与@Resource标签的区别" target="_blank">Spring中@Autowired标签与@Resource标签的区别</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%40Resource/1.htm">@Resource</a><a class="tag" taget="_blank" href="/search/%40Autowired/1.htm">@Autowired</a><a class="tag" taget="_blank" href="/search/%40Qualifier/1.htm">@Qualifier</a> <div>Spring不但支持自己定义的@Autowired注解,还支持由JSR-250规范定义的几个注解,如:@Resource、 @PostConstruct及@PreDestroy。   1. @Autowired    @Autowired是Spring 提供的,需导入    Package:org.springframewo</div> </li> <li><a href="/article/1510.htm" title="Changes Between SOAP 1.1 and SOAP 1.2" target="_blank">Changes Between SOAP 1.1 and SOAP 1.2</a> <span class="text-muted">sunjing</span> <a class="tag" taget="_blank" href="/search/Changes/1.htm">Changes</a><a class="tag" taget="_blank" href="/search/Enable/1.htm">Enable</a><a class="tag" taget="_blank" href="/search/SOAP+1.1/1.htm">SOAP 1.1</a><a class="tag" taget="_blank" href="/search/SOAP+1.2/1.htm">SOAP 1.2</a> <div>JAX-WS SOAP Version 1.2 Part 0: Primer (Second Edition) SOAP Version 1.2 Part 1: Messaging Framework (Second Edition) SOAP Version 1.2 Part 2: Adjuncts (Second Edition)   Which style of WSDL</div> </li> <li><a href="/article/1637.htm" title="【Hadoop二】Hadoop常用命令" target="_blank">【Hadoop二】Hadoop常用命令</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a> <div>以Hadoop运行Hadoop自带的wordcount为例,   hadoop脚本位于/home/hadoop/hadoop-2.5.2/bin/hadoop,需要说明的是,这些命令的使用必须在Hadoop已经运行的情况下才能执行   Hadoop HDFS相关命令  hadoop fs -ls  列出HDFS文件系统的第一级文件和第一级</div> </li> <li><a href="/article/1764.htm" title="java异常处理(初级)" target="_blank">java异常处理(初级)</a> <span class="text-muted">白糖_</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/Ajax/1.htm">Ajax</a> <div>从学习到现在从事java开发一年多了,个人觉得对java只了解皮毛,很多东西都是用到再去慢慢学习,编程真的是一项艺术,要完成一段好的代码,需要懂得很多。 最近项目经理让我负责一个组件开发,框架都由自己搭建,最让我头疼的是异常处理,我看了一些网上的源码,发现他们对异常的处理不是很重视,研究了很久都没有找到很好的解决方案。后来有幸看到一个200W美元的项目部分源码,通过他们对异常处理的解决方案,我终</div> </li> <li><a href="/article/1891.htm" title="记录整理-工作问题" target="_blank">记录整理-工作问题</a> <span class="text-muted">braveCS</span> <a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a> <div>1)那位同学还是CSV文件默认Excel打开看不到全部结果。以为是没写进去。同学甲说文件应该不分大小。后来log一下原来是有写进去。只是Excel有行数限制。那位同学进步好快啊。 2)今天同学说写文件的时候提示jvm的内存溢出。我马上反应说那就改一下jvm的内存大小。同学说改用分批处理了。果然想问题还是有局限性。改jvm内存大小只能暂时地解决问题,以后要是写更大的文件还是得改内存。想问题要长远啊</div> </li> <li><a href="/article/2018.htm" title="org.apache.tools.zip实现文件的压缩和解压,支持中文" target="_blank">org.apache.tools.zip实现文件的压缩和解压,支持中文</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a> <div>刚开始用java.util.Zip,发现不支持中文(网上有修改的方法,但比较麻烦) 后改用org.apache.tools.zip org.apache.tools.zip的使用网上有更简单的例子 下面的程序根据实际需求,实现了压缩指定目录下指定文件的方法 import java.io.BufferedReader; import java.io.BufferedWrit</div> </li> <li><a href="/article/2145.htm" title="读书笔记-4" target="_blank">读书笔记-4</a> <span class="text-muted">chengxuyuancsdn</span> <a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a> <div>1、JSTL 核心标签库标签 2、避免SQL注入 3、字符串逆转方法 4、字符串比较compareTo 5、字符串替换replace 6、分拆字符串 1、JSTL 核心标签库标签共有13个, 学习资料:http://www.cnblogs.com/lihuiyy/archive/2012/02/24/2366806.html 功能上分为4类: (1)表达式控制标签:out</div> </li> <li><a href="/article/2272.htm" title="[物理与电子]半导体教材的一个小问题" target="_blank">[物理与电子]半导体教材的一个小问题</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E9%97%AE%E9%A2%98/1.htm">问题</a> <div>       各种模拟电子和数字电子教材中都有这个词汇-空穴       书中对这个词汇的解释是; 当电子脱离共价键的束缚成为自由电子之后,共价键中就留下一个空位,这个空位叫做空穴       我现在回过头翻大学时候的教材,觉得这个</div> </li> <li><a href="/article/2399.htm" title="Flashback Database --闪回数据库" target="_blank">Flashback Database --闪回数据库</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E9%97%AA%E5%9B%9E%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">闪回数据库</a> <div>Flashback 技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要使用flashback 的特性,必须启用自动撤销管理表空间。 在Oracle 10g中, Flash back家族分为以下成员: Flashback Database, Flashback Drop,Flashback Query(分Flashback Query,Flashbac</div> </li> <li><a href="/article/2526.htm" title="简单排序:插入排序" target="_blank">简单排序:插入排序</a> <span class="text-muted">dieslrae</span> <a class="tag" taget="_blank" href="/search/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F/1.htm">插入排序</a> <div> public void insertSort(int[] array){ int temp; for(int i=1;i<array.length;i++){ temp = array[i]; for(int k=i-1;k>=0;k--)</div> </li> <li><a href="/article/2653.htm" title="C语言学习六指针小示例、一维数组名含义,定义一个函数输出数组的内容" target="_blank">C语言学习六指针小示例、一维数组名含义,定义一个函数输出数组的内容</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/c/1.htm">c</a> <div># include <stdio.h> int main(void) { int * p; //等价于 int *p 也等价于 int* p; int i = 5; char ch = 'A'; //p = 5; //error //p = &ch; //error //p = ch; //error p = &i; // </div> </li> <li><a href="/article/2780.htm" title="centos下php redis扩展的安装配置3种方法" target="_blank">centos下php redis扩展的安装配置3种方法</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a> <div>方法一 1.下载php redis扩展包  代码如下 复制代码 #wget http://redis.googlecode.com/files/redis-2.4.4.tar.gz 2 tar -zxvf 解压压缩包,cd /扩展包 (进入扩展包然后 运行phpize 一下是我环境中phpize的目录,/usr/local/php/bin/phpize (一定要</div> </li> <li><a href="/article/2907.htm" title="线程池(Executors)" target="_blank">线程池(Executors)</a> <span class="text-muted">shuizhaosi888</span> <a class="tag" taget="_blank" href="/search/%E7%BA%BF%E7%A8%8B%E6%B1%A0/1.htm">线程池</a> <div>在java类库中,任务执行的主要抽象不是Thread,而是Executor,将任务的提交过程和执行过程解耦 public interface Executor { void execute(Runnable command); }   public class RunMain implements Executor{ @Override pub</div> </li> <li><a href="/article/3034.htm" title="openstack 快速安装笔记" target="_blank">openstack 快速安装笔记</a> <span class="text-muted">haoningabc</span> <a class="tag" taget="_blank" href="/search/openstack/1.htm">openstack</a> <div>前提是要配置好yum源 版本icehouse,操作系统redhat6.5 最简化安装,不要cinder和swift 三个节点 172 control节点keystone glance horizon 173 compute节点nova 173 network节点neutron control /etc/sysctl.conf net.ipv4.ip_forward =</div> </li> <li><a href="/article/3161.htm" title="从c面向对象的实现理解c++的对象(二)" target="_blank">从c面向对象的实现理解c++的对象(二)</a> <span class="text-muted">jimmee</span> <a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1/1.htm">面向对象</a><a class="tag" taget="_blank" href="/search/%E8%99%9A%E5%87%BD%E6%95%B0/1.htm">虚函数</a> <div>1. 类就可以看作一个struct,类的方法,可以理解为通过函数指针的方式实现的,类对象分配内存时,只分配成员变量的,函数指针并不需要分配额外的内存保存地址。 2. c++中类的构造函数,就是进行内存分配(malloc),调用构造函数 3. c++中类的析构函数,就时回收内存(free) 4. c++是基于栈和全局数据分配内存的,如果是一个方法内创建的对象,就直接在栈上分配内存了。 专门在</div> </li> <li><a href="/article/3288.htm" title="如何让那个一个div可以拖动" target="_blank">如何让那个一个div可以拖动</a> <span class="text-muted">lingfeng520240</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a> <div> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml</div> </li> <li><a href="/article/3415.htm" title="第10章 高级事件(中)" target="_blank">第10章 高级事件(中)</a> <span class="text-muted">onestopweb</span> <a class="tag" taget="_blank" href="/search/%E4%BA%8B%E4%BB%B6/1.htm">事件</a> <div>index.html <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/</div> </li> <li><a href="/article/3542.htm" title="计算两个经纬度之间的距离" target="_blank">计算两个经纬度之间的距离</a> <span class="text-muted">roadrunners</span> <a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97/1.htm">计算</a><a class="tag" taget="_blank" href="/search/%E7%BA%AC%E5%BA%A6/1.htm">纬度</a><a class="tag" taget="_blank" href="/search/LBS/1.htm">LBS</a><a class="tag" taget="_blank" href="/search/%E7%BB%8F%E5%BA%A6/1.htm">经度</a><a class="tag" taget="_blank" href="/search/%E8%B7%9D%E7%A6%BB/1.htm">距离</a> <div>要解决这个问题的时候,到网上查了很多方案,最后计算出来的都与百度计算出来的有出入。下面这个公式计算出来的距离和百度计算出来的距离是一致的。 /** * * @param longitudeA * 经度A点 * @param latitudeA * 纬度A点 * @param longitudeB * </div> </li> <li><a href="/article/3669.htm" title="最具争议的10个Java话题" target="_blank">最具争议的10个Java话题</a> <span class="text-muted">tomcat_oracle</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1、Java8已经到来。什么!? Java8 支持lambda。哇哦,RIP Scala!   随着Java8 的发布,出现很多关于新发布的Java8是否有潜力干掉Scala的争论,最终的结论是远远没有那么简单。Java8可能已经在Scala的lambda的包围中突围,但Java并非是函数式编程王位的真正觊觎者。    2、Java 9 即将到来    Oracle早在8月份就发布</div> </li> <li><a href="/article/3796.htm" title="zoj 3826 Hierarchical Notation(模拟)" target="_blank">zoj 3826 Hierarchical Notation(模拟)</a> <span class="text-muted">阿尔萨斯</span> <a class="tag" taget="_blank" href="/search/rar/1.htm">rar</a> <div> 题目链接:zoj 3826 Hierarchical Notation 题目大意:给定一些结构体,结构体有value值和key值,Q次询问,输出每个key值对应的value值。 解题思路:思路很简单,写个类词法的递归函数,每次将key值映射成一个hash值,用map映射每个key的value起始终止位置,预处理完了查询就很简单了。 这题是最后10分钟出的,因为没有考虑value为{}的情</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>