LuManager服务器跑一段时间后就时间慢下来,有谁会设置自动核对时间的?

mikel阅读(5)

情况是这样,服务器应该是机房的问题,跑一段时间时间就慢下来,运行多一天,时间就会慢几秒。
有时候忘记调还会慢个1~2分钟。由于网站程序的内容需要很精准的时间。
现在的处理方法是每天上去运行 ntpdate pool.ntp.org 核对一下时间。
之前一段时间看到一个方法crontab -e
*  *  *  *  *  command
分  时  日  月 周  命令
30 08 * * * ntpdate pool.ntp.org
于是就试试了。设置每天早上8:30自动核对。

但是运行后老是提示这样
-bash: 30: command not found

运行了crontab -l查看列表
[root@u103148134-135 ~]# crontab -l
*/3 * * * * /usr/local/LuNamp/cmd/cron_common.sh
有看到zijidelu的一个时程

 

是不是 ntpdate没有安装。

centos
yum install ntp

debian
apt-get install ntpdate

30 08 * * * /usr/sbin/ntpdate ntp.api.bz

运行过yum install ntp安装yum install ntp了
直接在SSH里面运行ntpdate pool.ntp.org可以调整。
我是直接运行30 08 * * * ntpdate pool.ntp.org,我知道这样是错误的
百度了一下crontab的使用方法
编辑crontab文件
如果希望添加、删除或编辑crontab文件中的条目,而EDITOR环境变量又设置为vi,那么就可以用vi来编辑crontab文件,相应的命令为:$ crontab -e 可以像使用vi编辑其他任何文件那样修改crontab文件并退出。

我运行了crontab -e后,如下图

可以像使用vi编辑其他任何文件那样修改crontab文件并退出

2017年苹果开发者账号申请——账号VISA卡支付流程 – 24桥明月夜 – 博客园

mikel阅读(15)

来源: 2017年苹果开发者账号申请——账号VISA卡支付流程 – 24桥明月夜 – 博客园

1.登陆苹果账号,加入苹果开发者

https://developer.apple.com/

 

 

2.按照指示,一步步点击进入就行了,反正你也看不懂(或者懒得看这些英文)。我们直接进入主题

3.继续点击进入(这些步骤都是在你注册完apple id,并且完成公司邓白氏编码后才这么操作的

现在选择99美元(688RMB)的公司账户,点击下一步

 

5.按照要求,填写相关信息,不懂的留言。

 

 

补全所有信息就可以点击下一步了

 

6.确认刚才填入的信息是否正确,然后继续点击下一步。

.

.

 

7.最后苹果公司就开始受理你的申请请求了,审核很快,超级快,大概我提交完事半个小时就来电话了,和我确认相关信息,问了我公司名称,邮箱,电话(外加一个紧急联系人姓名电话邮箱,临时加的)。

.

 

8.电话确认完毕后,苹果公司会发送一份付款邮件给你的邮箱。点击进入就可以到付款流程了。

 

9.然后就是与苹果公司的条款协议,同意就行了。

 

10.确认要购买的账号,时间价格。

 

11.然后就进入到付款界面了,苹果公司只接受2种付款方式,一种就是VISA卡,另外一种是万事达卡(MasterCard),都可以在国内银行办理(怎么办理百度就出来了)。

然后按要求,填写卡号,及收货信息就可以了。发票是固定的,普票!

填完就可以提交订单了,之后苹果公司就会在你的VISA卡中扣款了,发票会已ems邮件的方式寄送给你。

你的邮箱中也会收到你的订单。

 

扣款完成你就会收到苹果公司发来的扣款邮件(含附件,电子收据),以及成为开发者的邮件。

最后恭喜你,苹果开发者账号已经购买成功!

 

好了,一整套的开发者账号购置就算结束了,你学会了吗?

在Windows平台使用IIS部署Flask网站 – Python – 伯乐在线

mikel阅读(18)

在 Windows 平台部署基于 Python 的网站是一件非常折腾的事情,Linux/Unix 平台下有很多选择,本文记录了 Flask 部署到 IIS 的主要步骤,希望对你有所帮助。

来源: 在Windows平台使用IIS部署Flask网站 – Python – 伯乐在线

在 Windows 平台部署基于 Python 的网站是一件非常折腾的事情,Linux/Unix 平台下有很多选择,本文记录了 Flask 部署到 IIS 的主要步骤,希望对你有所帮助。

涉及工具和平台

  • Windows 7 x64
  • Python 3.4+
  • Flask

完成 Hello Flask 网站

这是一个最简单的 Flask 网站:

# hello.py
from flask import Flask
app=Flask(__name__)

@app.route('/',methods=['GET'])
def index():
    return "Hello Flask!"

if __name__=='__main__':
    app.run(debug=True)

运行python hello.py后没有错误说明你的 Python 环境一切正常,可以继续后面的步骤。

安装 IIS,启用 CGI

在控制面板中找到打开或者关闭 Windows 功能,安装 IIS 和 CGI,如下图。

安装 URL 重写组件

IIS 需要安装 URL 重写组件,这个可以通过Microsoft Web Platform Installer来安装。下载Microsoft Web Platform Installer后运行,搜索url,分别安装。

注:据说 Windows10 上的 IIS 10 现在不支持 url 重写?待验证

安装 wfastcgi

通过pip就可以安装:

pip install wfastcgi

启用 wfastcgi

剩下的事情就只有一些配置了。首先以管理员身份运行wfastcgi-enable来在IIS上启用wfastcgi,这个命令位于c:\python_dir\scripts,也就是你需要确保此目录在系统的PATH里,或者你需要cd到这个目录后再执行。

# cd to python_dir\scripts if it is not in PATH
wfastcgi-enable

记住命令执行成功后返回的信息:

C:\Python34\Scripts> wfastcgi-enable
Applied configuration changes to section "system.webServer/fastCgi" for "MACHINE/WEBROOT/APPHOST" at configuration commit path "MACHINE/WEBROOT/APPHOST"
"C:\Python34\python.exe|C:\Python34\lib\site-packages\wfastcgi.py" can now be used as a FastCGI script processor

“C:Python34python.exe|C:Python34libsite-packageswfastcgi.py” 在下文的配置文件中需要使用。

Tips: 使用命令 wfastcgi-disable 可以将其移除。

创建 web.config 文件

下面是一个web.config文件的例子,你只需要修改对应部分就可以使用。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <!-- scriptProcessor 的值来自命令行工具 wfastcgi-enable -->
      <add name="FlaskFastCGI" path="*" verb="*" modules="FastCgiModule" scriptProcessor="C:\Python34\python.exe|C:\Python34\lib\site-packages\wfastcgi.py" resourceType="Unspecified" requireAccess="Script" />
    </handlers>
    <security> 
        <!-- URL 重写中的特殊字符,比如加号+等等 -->
        <requestFiltering allowDoubleEscaping="true"></requestFiltering> 
    </security> 
  </system.webServer>

  <appSettings>
    <!-- Required settings -->
    <!-- 在这里指定Falsk app在模块中的具体位置 -->
    <add key="WSGI_HANDLER" value="hello.app" />
    <add key="PYTHONPATH" value="~/" />

    <!-- Optional settings -->
    <!-- 需要先创建日志目录,否则报错 -->
    <add key="WSGI_LOG" value="C:\logs\oboeqa_web.log" />
    <add key="WSGI_RESTART_FILE_REGEX" value="" />
  </appSettings>
</configuration>

配置 IIS 目录及权限

假设你的 Flask 程序将部署在 C:websitehello 下面,那么你的目录结构大致如此。

C:\WEBSITE
└───hello
        hello.py
        web.config

现在你需要让IIS用户拥有访问和执行你的网站脚本的权限,进入 C:website 目录,执行下面两条命令:

cd C:\website
icacls . /grant "NT AUTHORITY\IUSR:(OI)(CI)(RX)"
icacls . /grant "Builtin\IIS_IUSRS:(OI)(CI)(RX)"

创建并访问你的网站

现在你离成功只差一步之遥,打开 IIS 管理面板,新建一个网站。

你只需要填上网站名称,物理地址和相应的端口号,点击确认。

打开浏览器,就可以访问你配置好的网站。如果有错误,可以去检查 web.config 中配置的日志文件。

简单总结

写完之后发现其实要完成的步骤并不是特别复杂,但是从摸索到实践的过程确实不易。本文仅讨论了部署的主要步骤,其实真正的生产环境你要考虑的问题可能更多,比如使用virtualenv 对网站进行隔离,安全问题,静态文件解析等等。

最后的惊喜

据说部署Python 网站到 IIS 还有更简单的办法,那就是安装宇宙最强的IDE – Visual Studio 2015 (VS2017 暂不支持 Python 开发),个人开发者可以免授权使用社区版。在 VS 中你可以使用 PTVS 来快捷开发并部署Python 程序,真正让你一键无忧。

PTVS 支持了常见的 Python Web 框架,比如 Flask,Django,Bottle,Jade 等等,调试的时候只需要按 F5,部署右键选择 publish,跟着向导一步两步你就可以完成魔鬼的步伐。

参考链接

Flask + mod_wsgi + Apache on Windows 部署成功(随时接受提问) – 火狐设计的专栏 – CSDN博客

mikel阅读(16)

来源: Flask + mod_wsgi + Apache on Windows 部署成功(随时接受提问) – 火狐设计的专栏 – CSDN博客

前言

说是前言,纯粹就是吐槽。如果你赶时间,完全可以跳过这部分,我保证不会在这里隐藏任何有用的内容。

人上年纪后,可能冲劲不足,我花了大概两周的时间才成功的将flask部署到windows上。还好没有放弃,最终找到了答案。

不过这也说明我在开源软件的应用和配置上还很差劲呀,当我看到要用VC10的C/C++编译器编译源代码时,头都大了。你说我们这些平时习惯了Vistual Studio编译的,哪还懂什么make命令呀。还好网上什么都有,连帮你编译的都有,因此,编译这一难没有经历。

对于flask这样的开源软件来说,部署总是有多种选择,我现在吐槽一下我试过的,但没有成功的经历。

  1. PyISAPIe + IIS
  2. CGI + IIS (虽然配置成功,但是不能解析wsgi)
  3. FastCGI + Nginx
  4. FastCGI + Lighttpd (需要cygwin进行编译)
当然,flask官方有关于部署文档,但是写得太简单。但我还是将链接粘出来。
http://dormousehole.readthedocs.org/en/latest/deploying/index.html

参考

https://claudiosparpaglione.wordpress.com/2013/03/06/how-to-deploy-flask-applications-to-apache-webserver/
我参考过很多链接,但是是这篇文章把我引向正途。

最终方案

Flask + mod_wsgi + Apache
Flask:  一个Python的web框架
mod_wsgi: 一个为Python编写的Apache的FastCGI模块
Apache: 一个类似于IIS的Web服务器
!!!注意 !!!
如果下面这一点没有做到,整个过程有99%的可能性会失败。
Apache,mod_wsgi和Python都必须用相同版本的C/C++编译器生成,它们要么是32位的,要么是64位的,不能混用。
因为我从Python官方站点上下载的Python 3.4就是32位的,并且是用VC10编译出来的。因此在下载Apache和mod_wsgi时,也必须选择32位的用VC10编译出来的版本。之前我就是没有注意到这个问题,所以导致一直没有安装成功。
这个问题的详细解释,参见: https://github.com/GrahamDumpleton/mod_wsgi/blob/master/win32/README.rst
另外,Python官方站点提供的似乎都是32位的版本,如果要64位的,估计需要自己动手编译了。
Windows下的编译器,参见: http://www.microsoft.com/express/vc/

步骤

  1. 安装Apache
  2. 安装mod_wsgi
  3. 安装Python
  4. 安装Flask
  5. 创建测试Web App
  6. 在Apache中配置站点
  7. 测试

1. 安装Apache

Apache是开源软件,针对windows环境,它不直接提供编译版本。
可以在http://www.apachelounge.com/download/ 下载适合自己环境的版本。
根据我自己当前的环境,我选择的是Win32 VC10编译出来的Apache2.4版本
将压缩包下载到本机,然后将压缩包里面的Apache24文件夹拷贝到C:\。
当然,你可以拷贝到你的系统的任何位置,但Apache的默认配置是C:\Apache24。

如果你本机运行了IIS,将其关掉。因为IIS和Apache都默认用的是80端口。如果你想配置其它端口,我相信那也不难。等把Flask部署成功后再来捣鼓吧。

打开cmd
>cd c:\
>cd Apache24\bin\
>httpd

然后打开浏览器,输入
http://localhost

如果网页上显示 It Works! ,那说明apache服务器运行起来了。

2. 安装mod_wsgi

这个module可不能随便装,它是启动Python的关键。
我不知道为什么Flask的官方站点上不把这个模块的安装列出来。只是简单的说了一下httpd.confg的配置,实在是太不负责任了。
从下面这个链接下载mod_wsgi
https://code.google.com/p/modwsgi/downloads/detail?name=mod_wsgi-win32-ap22py27-3.3.so
这个包里面包含了32位和64位的编译版本,下载完成后选择
mod_wsgi-windows-4.4.12.tar\mod_wsgi-windows-4.4.12\Apache24-win32-VC10\modules\mod_wsgi-py34-VC10.so。
因为我当前安装的Python是32位的,所以必须选择mod_wsgi-py34-VC10.so

将mod_wsgi-py34-VC10.so拷贝至C:\Apache24\modules\下,并更名为mod_wsgi.so。

打开 c:\Apache24\conf\httpd.conf 添加如下配置
LoadModule wsgi_module modules/mod_wsgi.so

从新启动httpd,如果没有报错,说明mod_wsgi模块在apache里面加载成功了。

3. 安装Python

我在这里安装的是Python 3.4,默认安装在c:\Python34\ 目录下。
Python 3.4安装时,最好选择将Python添加到系统目录。安装完成后就可以直接运行Python的相关程序了,例如下面安装flask时用到的pip

4. 安装flask

非常讽刺的是,我在尝试部署flask应用的过程中,居然忘记装flask。导致我在网页上面看到apache爆出的错误信息。期初我还认为是Apache的问题,经过查看c:\Apache24\logs\error.log后才发现,原来是flask没有安装。
直接打开cmd,运行如下命令
pip install flask

它会自动将flask和flask依赖的两个库全部装上,这太方便了。

5. 创建Web App

下面的代码直接拷贝而来
创建C:\Test_Web\test.py

  1. from flask import Flask, request
  2. app = Flask(__name__)
  3. @app.route(‘/hello’)
  4. def hello_world():
  5. name = request.args.get(‘name’,)
  6. return ‘Hello ‘ + name + ‘!’
  7. if __name__ == ‘__main__’:
  8. app.run()

创建C:\Test_Web\test.wsgi

  1. import sys
  2. #Expand Python classes path with your app’s path
  3. sys.path.insert(0“c:/Test_Web”)
  4. from test import app
  5. #Put logging code (and imports) here …
  6. #Initialize WSGI app object
  7. application = app

注意,application一定不能改成别的。因为mod_wsgi在解析这个文件时,只认application。
另外,同IIS不同的时,不需要给C:\Test_Web文件夹加入NETWORK SERVICE用户的访问权限。

6. 在Apache中配置站点

只需要将以下代码加入到C:\Apache24\conf\httpd.conf文件中。

  1. <VirtualHost *:80 >
  2. ServerAdmin example@company.com
  3. DocumentRoot c:\Test_Web
  4. <Directory “c:\Test_Web”>
  5. Order allow,deny
  6. Allow from all
  7. </Directory>
  8. WSGIScriptAlias /flasktest c:\Test_Web\test.wsgi
  9. </VirtualHost>

我对Apache的配置纯粹是外行。我的理解是一个VirtualHost节点就相当于在IIS里面的一个Web Site节点。如果我的理解有误,还望各位路过的Apache配置高手纠正。
我在研究的过程中还看见有人将站点的配置放在另外一个conf文件中,然后将其包含至httpd.conf。

7. 测试

现在,打开浏览器,输入 http://localhost/flasktest/hello?name=CZY

如果你看见网页上出现 Hello CZY! 说明你的站点运行起来了。

剩下的工作就是以当前的工作为原型,开始Python的Web App开发之旅吧。如果你在尝试的过程中遇到什么问题,请给我随时在CSDN上留言。

SQL Server2008配置管理工具服务显示远程过程调用失败 – 留校察看 – 博客园

mikel阅读(19)

来源: SQO2008配置管理工具服务显示远程过程调用失败 – 留校察看 – 博客园

前两天,装了VS2012后,打开SQL2008配置管理工具,发现SQL服务名称里什么也没有,只有一个提示:(如图)              

上网搜了,试了很多方法,像什么把windows\system32\wbem下的framedyn.dll复制到system32目录下,还有照一个老外说的,下什么更新补丁,都没用!!

想重装SQL2008,结果运行安装程序,变成了英文版(以前装显示的是中文的),而且安装根目录选不了!巨想死!

万念俱灰下,打开360,卸载了一个叫”Microsoft SQL Server 2012LocalDB”,重新打开SQL配置管理器,发现可以了~高兴啊!!

 

 

Docker实践–部署Nodejs应用 – lpxxn – 博客园

mikel阅读(20)

来源: Docker实践–部署Nodejs应用 – lpxxn – 博客园

这个例子的目标是为了向大家展示如何在Docker的container里运行Node.js程序。我会先创建一个简单的Node.js web

app,来构建一个镜像。然后基于这个Image运行一个container。从而实现快速部署。

由于网络的原因我的Node.js镜像从国内的镜像库下载,而不是Docker Hub。

先从国内的镜像网站上pull下一下nodejs镜像。

docker pull hub.c.163.com/nce2/nodejs:0.12.2

下载完后查看我们的镜像,找到他的名称,等会我们会用到

创建Node.js 程序

创建package.json,并写入相关信息和依赖

vi package.json
复制代码
{
  "name": "webtest",
  "version": "1.0.0",
  "description": "Node.js on Docker",
  "author": "lpxxn",
  "main": "server.js",
  "scripts": {
    "start": "node server.js"
  },
  "dependencies": {
    "express": "^4.13.3"
  }
}
复制代码

创建server.js

vi server.js

写一个最简单web 这个web基于express框架,返回Hello word.注意我们监听的是8888端口

复制代码
'use strict';

var express = require('express');

var PORT = 8888;

var app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});

app.listen(PORT);
console.log('Running on http://localhost:' + PORT);
复制代码

  创建Dockerfile

接下来主角上场了创建Dockerfile文件 这个文件是创建镜像所必须的文件

vi Dockerfile

Docker会依照Dockerfile的内容来构建一个镜像。我先给出完整的代码,再一行一行的给出解释

复制代码
FROM hub.c.163.com/nce2/nodejs:0.12.2

# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

# Bundle app source
COPY . /home/Service
RUN npm install

EXPOSE 8888
CMD [ "npm", "start" ]
复制代码

我们来一句一句的解释

FROM hub.c.163.com/nce2/nodejs:0.12.2

FROM是构建镜像的基础源镜像,hub.c.163.com/nce2/nodejs:0.12.2 这个是镜像的名称,也就是我们一开始从国内服务器上拉下来的那个Image。如果本地没有Docker 会自己pull镜像。

# Create app directory
RUN mkdir -p /home/Service
WORKDIR /home/Service

第一句RUN 用于在Image里创建一个文件夹,将来用于保存我们的代码。

第二句WORKDIR是将我们创建的文件夹做为工作目录。

 

# Bundle app source
COPY . /home/Service
RUN npm install

第一句的COPY是把本机当前目录下的所有文件拷贝到Image的/home/Service文件夹下。

第二句的RUN 使用npm 安装我们的app据需要的所有依赖。

 

EXPOSE 8888

由于我们的web app监听的是8888端口,我们把这个端口暴露给主机,这样我就能从外部访问web了。

 

CMD [ "npm", "start" ]

这个我相信我不用解释你也能看出来他是做什么的。运行npm start命令,这个命令会运行 node service.js来

启动我们的web app。

构建Image

在你Dockerfile文件所在的目录下运行下面的命令来构建一个Image.

docker build -t mynodeapp .

别忘了最的的那个点

构建完后查看一下我们的镜像

 

 运行镜像

docker run -d -p 8888:8888 ac5

-d 表明容器会在后台运行,-p 表示端口映射,把本机的8888商品映射到container的8888端口这样外网就能通过本机的8888商品访问我们的web了。

后面的ac5是我们Image的ID因为前3个就已经能定位出这个Image所以我就没有把后边的再写出来。

通过docker ps 查看我们刚运行的Container的ID

打印log  7370就是我们的Container ID,和Image ID一样,你也可以全写出来,我比较懒就写前4位,已经足够标识出这个Container了

docker logs 7350

 

 

如果你想到Container里可以执行下面的命令,进入到里边后就可以像操作普通的linux 一样。如果想退出可执行exit命令。

 

 测试

我们先通过curl 看能不能访问我们的web。

curl -i localhost:8888

也可以通过浏览器来看一下

好了,这个小教程到此就结束了,希望能帮助你入门。

Spring思维导图(MVC篇) – air_balloon – 博客园

mikel阅读(20)

来源: Spring思维导图(MVC篇) – air_balloon – 博客园

生活就像海洋,只有意志坚强的人才能到达彼岸。

已经很久没有发文章了呀,想必大家都挂念我了,哈哈。

温故而知新,今天一起来复习一下spring mvc的内容吧。

spring mvc简介与运行原理

Spring的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。

原理.png
  • (1) Http请求:客户端请求提交到DispatcherServlet。
  • (2) 寻找处理器:由DispatcherServlet控制器查询一个或多个HandlerMapping,找到处理请求的Controller。
  • (3) 调用处理器:DispatcherServlet将请求提交到Controller。
  • (4)(5)调用业务处理和返回结果:Controller调用业务逻辑处理后,返回ModelAndView。
  • (6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。
  • (8) Http响应:视图负责将结果显示到客户端。

主要注解

spring mvc注解.png

ContextLoaderListener

在讲ContextLoaderListener之前,首先来了解一下web.xml的作用。

  • 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的。web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。当你的web工程没用到这些时,你可以不用web.xml文件来配置你的Application。
  • 当要启动某个web项目时,服务器软件或容器如(tomcat)会第一步加载项目中的web.xml文件,通过其中的各种配置来启动项目,只有其中配置的各项均无误时,项目才能正确启动。web.xml有多项标签,在其加载的过程中顺序依次为:context-param >> listener >> fileter >> servlet​。(同类多个节点以出现顺序依次加载)

web.xml加载过程.png

而spring mvc启动过程大致分为两个过程:

  • ContextLoaderListener初始化,实例化IoC容器,并将此容器实例注册到ServletContext中。
  • DispatcherServlet初始化。

web.xml配置.png

其中ContextLoaderListener监听器它实现了ServletContextListener这个接口,在web.xml配置这个监听器,启动容器时,就会默认执行它实现的方法。在ContextLoaderListener中关联了ContextLoader这个类,所以整个加载配置过程由ContextLoader来完成。

  • ContextLoaderListener在web.xml中的配置
<!-- 配置contextConfigLocation初始化参数 -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>

<!-- 配置ContextLoaderListerner -->
<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

ServletContextListener 接口有两个方法:contextInitialized,contextDestroyed

DispatcherServlet

Spring MVC框架,与其他很多web的MVC框架一样:请求驱动;所有设计都围绕着一个中央Servlet来展开,它负责把所有请求分发到控制器;同时提供其他web应用开发所需要的功能。不过Spring的中央处理器,DispatcherServlet,能做的比这更多。

下图展示了Spring Web MVC的DispatcherServlet处理请求的工作流。熟悉设计模式的朋友会发现,DispatcherServlet应用的其实就是一个“前端控制器”的设计模式(其他很多优秀的web框架也都使用了这个设计模式)。

  • 流程图

spring mvc处理请求的流程.jpg
  • 在web.xml中的配置
<!-- servlet定义 -->
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

其中

  • load-on-startup:表示启动容器时初始化该Servlet;
  • url-pattern:表示哪些请求交给Spring Web MVC处理, “/” 是用来定义默认servlet映射的。也可以如“*.html”表示拦截所有以html为扩展名的请求。

在Spring MVC中,每个DispatcherServlet都持有一个自己的上下文对象WebApplicationContext,它又继承了根(root)WebApplicationContext对象中已经定义的所有bean。这些继承的bean可以在具体的Servlet实例中被重载,在每个Servlet实例中你也可以定义其scope下的新bean。

WebApplicationContext继承自ApplicationContext,它提供了一些web应用经常需要用到的特性。它与普通的ApplicationContext不同的地方在于,它支持主题的解析,并且知道它关联到的是哪个servlet(它持有一个该ServletContext的引用)

DispatcherServlet继承结构

spring mvc同时提供了很多特殊的注解,用于处理请求和渲染视图等。DispatcherServlet初始化的过程中会默认使用这些特殊bean进行配置。如果你想指定使用哪个特定的bean,你可以在web应用上下文WebApplicationContext中简单地配置它们。

特殊bean.png

其中,常用的ViewResolver的配置。以jsp作为视图为例

<!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsp/" />
    <property name="suffix" value=".jsp" />
</bean>

配置上传文件限制MultipartResolver

<!-- 上传限制 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
     <!-- 上传文件大小限制为31M,31*1024*1024 -->
     <property name="maxUploadSize" value="32505856"/>
</bean>

applicationContext.xml中的标签

applicationContext.xml配置文件标签.png

文件上传

前面说到DispatcherServlet中有个特殊的Bean叫MultipartResolver,可用于限制文件的上传大小等。当解析器MultipartResolver完成处理时,请求便会像其他请求一样被正常流程处理。

  • 表单
<form method="post" action="/form" enctype="multipart/form-data">
     <input type="text" name="name"/>
     <input type="file" name="file"/>
     <input type="submit"/>
</form>
  • 控制器
@RequestMapping(path = "/form", method = RequestMethod.POST)
 public String handleFormUpload(@RequestParam("name") String name, 
            @RequestParam("file") MultipartFile file) {

   if (!file.isEmpty()) {
          byte[] bytes = file.getBytes();
          // store the bytes somewhere
          return "redirect:uploadSuccess";
    }
    return "redirect:uploadFailure";
}

异常处理

先来说下常见的异常处理有几种方式,如下图:

异常处理方式.png

Spring的处理器异常解析器HandlerExceptionResolver接口的实现负责处理各类控制器执行过程中出现的异常。也是上面提到的,是DispatcherServlet中的特殊bean,可以自定义配置处理。

某种程度上讲,HandlerExceptionResolver与你在web应用描述符web.xml文件中能定义的异常映射(exception mapping)很相像,不过它比后者提供了更灵活的方式。比如它能提供异常被抛出时正在执行的是哪个处理器这样的信息。

  • HandlerExceptionResolver 提供resolveException接口
public interface HandlerExceptionResolver {  
    ModelAndView resolveException(  
            HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex);  
}
  • 在BaseController中使用 @ExceptionHandler注解处理异常
    @ExceptionHandler(Exception.class)
    public Object exceptionHandler(Exception ex, HttpServletResponse response, 
              HttpServletRequest request) throws IOException {
        String url = "";
        String msg = ex.getMessage();
        Object resultModel = null;
        try {
            if (ex.getClass() == HttpRequestMethodNotSupportedException.class) {
                url = "admin/common/500";
                System.out.println("--------毛有找到对应方法---------");
            } else if (ex.getClass() == ParameterException.class) {//自定义的异常

            } else if (ex.getClass() == UnauthorizedException.class) {
                url = "admin/common/unauth";
                System.out.println("--------毛有权限---------");
            }

            String header = req.getHeader("X-Requested-With");
            boolean isAjax = "XMLHttpRequest".equalsIgnoreCase(header);
            String method = req.getMethod();
            boolean isPost = "POST".equalsIgnoreCase(method);

            if (isAjax || isPost) {
                return Message.error(msg);
            } else {
                ModelAndView view = new ModelAndView(url);
                view.addObject("error", msg);
                view.addObject("class", ex.getClass());
                view.addObject("method", request.getRequestURI());
                return view;
            }
        } catch (Exception exception) {
            logger.error(exception.getMessage(), exception);
            return resultModel;
        } finally {
            logger.error(msg, ex);
            ex.printStackTrace();
        }
    }
  • 在web.xml中处理异常
<!-- 默认的错误处理页面 -->
<error-page>
    <error-code>403</error-code>
    <location>/403.html</location>
</error-page>
<error-page>
    <error-code>404</error-code>
    <location>/404.html</location>
</error-page>
<!-- 仅仅在调试的时候注视掉,在正式部署的时候不能注释 -->
<!-- 这样配置也是可以的,表示发生500错误的时候,转到500.jsp页面处理。 -->
<error-page> 
    <error-code>500</error-code> 
    <location>/500.html</location> 
</error-page> 

<!-- 这样的配置表示如果jsp页面或者servlet发生java.lang.Exception类型(当然包含子类)的异常就会转到500.jsp页面处理。 -->
<error-page> 
    <exception-type>java.lang.Exception</exception-type> 
    <location>/500.jsp</location> 
</error-page> 

<error-page> 
    <exception-type>java.lang.Throwable</exception-type> 
    <location>/500.jsp</location> 
</error-page>

<!-- 当error-code和exception-type都配置时,exception-type配置的页面优先级高及出现500错误,发生异常Exception时会跳转到500.jsp-->
  • 来一个问题:HandlerExceptionResolver和web.xml中配置的error-page会有冲突吗?

解答:如果resolveException返回了ModelAndView,会优先根据返回值中的页面来显示。不过,resolveException可以返回null,此时则展示web.xml中的error-page的500状态码配置的页面。
当web.xml中有相应的error-page配置,则可以在实现resolveException方法时返回null。
API文档中对返回值的解释:
return a corresponding ModelAndView to forward to, or null for default processing.

写在最后

下篇文章将会写Spring aop的内容,同样以思维导图的方式编写。可视化学习,让java不再难懂。

作者:java思维导图
链接:http://www.jianshu.com/p/6b15246a48db
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

如何用好 github 中的 watch、star、fork – 简书

mikel阅读(20)

来源: 如何用好 github 中的 watch、star、fork – 简书

在每个 github 项目的右上角,都有三个按钮,分别是 watch、star、fork,但是有些刚开始使用 github 的同学,可能对这三个按钮的使用却不怎么了解,包括一开始使用 github 的我也是如此。这篇博客,结合自的理解和使用,说说这三个按钮的用法以及一些个人见解。

如下图所示这是我们经常看到的三个按钮。

从左至右,依次是 watch star fork,下面分别说下他们的具体作用。

watch

watch 翻译过来可以称之为观察,点击 watch 可以看到如下的列表。

对于别人的项目,默认自己都处于 Not watching 的状态,当你选择 Watching,表示你以后会关注这个项目的所有动态,这个项目以后只要发生变动,如被别人提交了 pull request、被别人发起了issue等等情况,你都会在自己的个人通知中心,收到一条通知消息,如果你设置了个人邮箱,那么你的邮箱也可能收到相应的邮件。

如下,我 watching 了开源项目android-cn/android-discuss,那么以后任何人只要在这个项目下提交了 issue 或者在 issue 下面有任何留言,我的通知中心就会通知我。如果你配置了邮箱,你还可能会因此不断的收到通知邮件。

如果你不想接受这个项目的所有通知,那么点击 Not Watching 即可。

另外这里有一篇文章讲 如何正确接收 GitHub 的消息邮件,很不错的一篇文章,推荐大家看看。

star

star 翻译过来是星,但这个翻译没任何具体意义,这里解释为`关注`或者`点赞`更合适,当你点击 star,表示你喜欢这个项目或者通俗点,可以把他理解成朋友圈的点赞吧,表示对这个项目的支持。

不过相比朋友圈的点赞,github 里面会有一个列表,专门收集了你所有 star 过的项目,点击 github 个人头像,可以看到 your stars 的条目,点击就可以查看你 star 过的所有项目了,如下图所示

不过,star 列表很容易出现这样的问题:如果你平时比较爱逛 Github, star 的项目过多后怎么快速查找自己想要的项目怎么办?

这时,如果 github 可以提供一个分类功能该多好,就像微信公众号文章的收藏,你在点击微信菜单中的收藏后,微信会提示你对收藏的文章设置 tag。这样设置的好处是,以后在微信收藏列表中查找项目时,可以根设置的 tag 归类查找,这样查找效率会提高不少。

但是不知道 github 的产品经理是怎么想的,github 本身没有这个功能。但是 github 这个全球最大的程序员社区从来也不缺有思想有执行力的程序员。

这不,现在就有人做了一个 Chrome 插件,这个插件可以对 github 中所有 star 的项目进行分类,如下所示,注意看图片右侧,多了一个 Filter by tag 列表。

下载地址.

尽管这个插件已经很好了,但是还是有缺点,你只能 star 完项目了,然后去 star 列表,才能对项目打 tag,这是很不方便的。真心希望,未来 github 可以自己支持对 star 的 tag 处理。憧憬…

更新

也许是 github 自己也发现了检索的问题,现在 github 增加了一个类似的功能,可以给自己给自己的项目设置 topic. 如下图所示。

topic

给自己的项目设置 topic 后,相当于自己给自己的项目设置了一个 tag ,这样可以方便别人搜索。比如要搜索所有 topic 为 Android 的项目,你只需要在 GitHub 搜索时输入 `topic Android ` 然后搜索即可。

fork

当选择 fork,相当于你自己有了一份原项目的拷贝,当然这个拷贝只是针对当时的项目文件,如果后续原项目文件发生改变,你必须通过其他的方式去同步。

一般来说,我们不需要使用 fork 这个功能,除非有一些项目,可能存在 bug 或者可以继续优化的地方,你想帮助原项目作者去完善这个项目或者单纯的想在原来项目基础上己维护一个属于自己项目(比如我 fork 的 AndroidWeekly 客户端,那么你可以 fork 一份项目下来,然后自己对这个项目进行修改完善,当你觉得项目没问题了,你就可以尝试发起 pull request 给原项目作者了。

然后就静静等待他的 merge 邮件通知了。

我看到很多人错误的在使用 fork。很多人把 fork 当成了收藏一样的功能,包括一开始使用 github 的我,每次看到一个好的项目就先 fork,

因为这样,就可以我的 repository(仓库)列表下查看 fork 的项目了。其实你完全可以使用 star 来达到这个目的。

使用建议

1、对于一些可能会经常发生变化的会不定期更新的好项目 多使用 watch.

比如 Android-cn 团队的 android-discuss 项目,

你就可以 watching 它,这里面都是一些关于 Android 技术的交流,如果有任何新问题,你都可以收到通知,你可以查看别人的回答,

你可以回答别人提出的问题,这是一个很好的学习成长方式。

其他值得watch的项目还有很多,比如 github 上很多的 Awesome 系列的项目,如 Awesome-MaterialDesign 等,你 watch 这些项目了,

只要项目新增一些好玩好用的东西,你就会收到通知。

我在知乎上看到有人问这样的问题,说 github 上有哪些值得 watch 的项目,其实有很多,我自己也整理了一些,但是没放到 github.

值得注意的是,如果 watch多了,你可能会被无休止的邮件通知烦死(邮件通知可设置),因为被 watch 项目有任何留言、PR等更新都会触发通知,所以做好权衡。

2、喜欢一个项目就 star 它吧~

3、修改开源项目就使用 fork,这样你就可以在原项目的基础上,对项目进行修改提交,现在你是这个项目的主人啦~

小细节

有些时候,你看到一个项目的 star 数有很多,你就想知道到底都有那些人 star 了这个项目,或者 fork 了这个项目,

但是环顾一圈,你却找不到一个入口,后来自己不经意的发现,只要`点击 star 傍边的数字`,就可以查看有哪些人 star 了这个项目。

是不是有点意思,现在你就可以去试试,watch、fork上面的数字都是可以点击的,道理一样。

结语

这里只说了关于这三个按钮的使用,github 肯定还有很多使用技巧,欢迎大家多多讨论,互相学习。另外我在 android-cn 的 android-discuss 下面和知乎上

都分别提了类似的问题,大家感兴趣的可以关注下。

Github Github上都有哪些有意思、不为大家熟知的小功能?

知乎 Github上都有哪些有用但不为大家熟知的小功能?

作者:大侠咕咚
链接:http://www.jianshu.com/p/6c366b53ea41
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

ASP.NET 4.0 一些隐性的扩展 – 阿不 – 博客园

mikel阅读(20)

来源: ASP.NET 4.0 一些隐性的扩展 – 阿不 – 博客园

ASP.NET 4.0在很多方面都做了改进,在这篇ASP.NET 4.0白皮书就描述了很多ASP.NET 4.0的机制改变和改进。在我的博客中,也有几篇关于ASP.NET4.0的特性修改的文章。但是作为一个全新的框架和运行时,内部肯定还会有很多API和扩展点不会暴露的那么明显。比如今天从这篇文章Three Hidden Extensibility Gems in ASP.NET 4的介绍中,我又了解了一些在我平常开发中绝对非常有用的扩展点。

PreApplicationStartMethodAttribute

这个新的Attribute可以让我们指定一个公共的静态函数,让它在站点的Application_Start之前执行该函数。如果你的站点有App_code目录,这个函数同样也会在App_code目录下的代码被编译之前执行。从我的直觉中,这是一个相当有用的扩展点。

我们必须从assembly级别上来使用这个attribute,也就是通常情况下我们会用在AssemblyInfo.cs中:

1
2
[assembly: PreApplicationStartMethod(
typeof(SomeClassLib.Initializer), "Initialize")]

我们需要指定的是类型和类型里面静态函数的名称,这个静态函数必须是不带参数和返回值的公共函数。

这个功能最重要的地方是在于,它可以做一些我们原来在Application_Start无法完成的事情,所以很多事情在执行到Application_Start时已经完成了,不可改变的,比如下面要介绍的关于编译的扩展。

BuildProvider.RegisterBuildProvider

原来我们要注册BuildProvider都是通过添加web.config的<buildproviders>来完成。在ASP.NET 4.0当中,我们就可以配合PreApplicationStartMethodAttribute,在站点启动前添加自定义的来BuildProvider达到目的。

BuildManager.AddReferencedAssembly

在做.ASPX/.ASPCX和App_code目录下的代码文件编译时,需要依赖一些程序集。以前,我们都需要将这些程序集配置在web.config的<assemblies>节点下来完成。现在,你就只需要配合以上的attribute和这个新的方法,直接通过代码的形式来增加这些依赖。

Config-free IHttpModule Registration

这也是对PreApplicationStartMethodAttribute的一个绝对的妙用,在Nikhil Kothari这篇文章中有详细的介绍。它的主要目标,也是脱离Web.config就可以通过代码来注册IHttpModule。

总之虽然只是一个简单的attribute,可是它却非常的有用。当我们开发是一个可复用的框架时,我们不可避免的会需要在程序中做很多相关的配置才能让程序跑起来。而以前,我们就只能要求用户通过Web.config来完成,而当用户少了一个配置就可能会导致整个框架无法运行。如果我们能将这些必须的配置,都在我们的框架内部来完成,这样就可以大大降低框架的使用门槛。

阿不 http://hjf1223.cnblogs.com

使用PreApplicationStartMethodAttribute – liqipeng – 博客园

mikel阅读(22)

来源: 使用PreApplicationStartMethodAttribute – liqipeng – 博客园

第一次见到这个东西是在公司的框架里,刚开始还挺郁闷怎么框架的Application_Start里没东西,初始化的那些代码都哪去了,后来通过一些线索找到了PreApplicationStartMethodAttribute。

这里简单记录一下。

 

1. 作用

指定某个函数在站点的Application_Start之前执行。

2. 用法

1
[assembly: PreApplicationStartMethod(typeof(SomeClassLib.Initializer), "Initialize")]

一般放在AssemblyInfo.cs。

可以注册多个。

3. 用途

它可以让我们脱离web.config做一些事情,如注册自定义IHttpModule、注册BuildProvider

4. 注意

不能保证调用程序集定义的应用程序启动方法的顺序。 因此,每个注册的开始方法应该将代码编写为分开运行,不应该依赖于其他注册开始方法的副作用。(摘自MSDN)