胜博发娱乐城如何用 python 写出像 javascript 这样的闭包?

( 胜博发娱乐城 )

var foo = function(n){
    var count = n;
    function bar(){
        n = count
        count+=1;
        return n
    }
    return bar
}
>>>p = foo(10)
>>>p()
10
>>>p()
11
>>>p()
12

python 由于作用域的关系,函数内可以访问函数外部环境变量的值。但是不能对这个外部的环境变量进行操作。

好像 python 的闭包不是这么用的?

两个函数之间共享一个变量最方便的还是在一个 class 中用 self ?

def func(data):
    count = data
    def wrap():
        count += 1
        return count
    return wrap
>>>p = func(10)
>>>p()
UnboundLocalError: local variable 'count' referenced before assignment
#但是不是赋值,而是用一个数组保存数组,就可以
def func(data):
    count = [data]
    def wrap():
        count[0] += 1
        return count[0]
    return wrap
>>>p = func(10)
>>>p()
11
>>p()
12
>>p()
13

谁能具体解释一下这个的原因?

yield 嘻嘻

def foo(n):
    while True:
        yield n
        n += 1

>>> p = foo(10)
>>> p.next()
10
>>> p.next()
11
>>> p.next()
12

这是因为int是不可变的,你对它+= 1,它会构建出一个新的加了1的int,而count指向的那个int是没有变的,这对所有的不可变对象都是一样的道理。而list是可变的,就是说你可以不用改变count的指向就可以改变count的内容。

至于为什么会有UnboundLocalError,参见这个官方faq

使用 global 关键字

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

sbf999胜博发官方网站Yosemite DP 7 安装mysql-python失败

( sbf999胜博发官方网站 )

Yosemite DP7 下使用:pip install mysql-python失败。
错误信息如下:

贴图又更新了……就不能贴文本么……非要贴个图片上来…………

显然你是在用OSX10.10+Xcode6.0的组合,要知道Xcode6.0里面是木有10.10SDK的。
去网上下载一个Xcode 6.1 Beta吧,那里面有10.10SDK。


你要先装Xcode
如果你从Xcode5升级到了Xcode6,那有可能你的xcode-tool路径还是老的,你可以看看xcode-select -p的输出是不是之前Xcode5下的目录,如果是这样你需要更新一下,用命令:
sudo xcode-select -s /Applications/Xcode-Beta.app/Contents/Developer
这里的/Applications/Xcode-Beta.app/Contents/Developer是你的Xcode6安装目录,确认是否正确。
如果上述都没问题,再用sudo xcode-select --install命令确认命令行工具都装了。

嗯?你问题里的贴图更新了?现在的错误是“CrushReporterSupport”找不到了?这东西是你装了没有?

同楼上,编译需要xcode的编译工具链支持

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…

sbf999胜博发官方网站让 jinja2 转义 html 的时候允许指定部分 之类的标签转义

( sbf999胜博发官方网站 )

Flask 的模板 Jinja2 会将所有的 html 转义,我想让输出的 <img><code> 等指定的标签不进行转义,让他们正常输出,有何良策?

可以试试 safe 这个filter,原始的 string 就不会被 escape

{{ some html string|safe }}

feedparser 里有 HTML sanitization 功能。

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…

胜博发娱乐城python怎么处理二进制流

( 胜博发娱乐城 )

我现在读取了芯片的数据,但是它是二进制流。我想把它print出来,怎么处理呢?

binascii — Convert between binary and ASCII

binascii.b2a_hex(data)
binascii.hexlify(data)
Return the hexadecimal representation of the binary data. Every byte of data is converted into the corresponding 2-digit hex representation. The resulting string is therefore twice as long as the length of data.

binascii.a2b_hex(hexstr)
binascii.unhexlify(hexstr)
Return the binary data represented by the hexadecimal string hexstr. This function is the inverse of b2a_hex(). hexstr must contain an even number of hexadecimal digits (which can be upper or lower case), otherwise a TypeError is raised.

之前模仿java的Bytebuffer写的一个读取/写入 字节数组的类,希望对你有帮助
https://github.com/hongliuliao/jafka-python-client/blob/master/src/jafka_utils.py

struct模块中的packunpack函数.

基因芯片吗?affy的cel文件可以用r来读的。

struct模块可以对二进制数据进行解析和封装的功能,参考:
http://blog.guozengxin.cn/2013/07/25/python-struct-pack-unpack/

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

胜博发娱乐Python 爬虫遇到形如 小说 的编码如何转换为中文?

( 胜博发娱乐 )

<dt>学科主题:</dt>
                <dd><a href="openlink.php?keyword=%E9%95%BF%E7%AF%87%E5%B0%8F%E8%AF%B4">&#x957f;&#x7bc7;&#x5c0f;&#x8bf4;</a>-&#x4e2d;&#x56fd;-&#x5f53;&#x4ee3;</dd>
            </dl>
                        <dl class="booklist">
                <dt>中图法分类号:</dt>
                <dd><a href="openlink.php?coden=I247.5">&#x0049;&#x0032;&#x0034;&#x0037;&#x002e;&#x0035;</a></dd>
            </dl>
                        <dl class="booklist">
                <dt>提要文摘附注:</dt>
                <dd>&#x5c0f;&#x8bf4;&#x4e2d;&#x7684;&#x4e3b;&#x4eba;&#x516c;&#xff0c;&#x6b63;&#x662f;&#x56e0;&#x4e3a;&#x5f53;&#x5e74;&#x76d7;&#x5893;&#x7684;&#x7237;&#x7237;&#x4eba;&#x8d58;&#x676d;&#x5dde;&#x800c;&#x8eab;&#x5728;&#x676d;&#x5dde;&#xff0c;&#x5f00;&#x4e86;&#x4e00;&#x5bb6;&#x5c0f;&#x7684;&#x53e4;&#x8463;&#x94fa;&#x5b50;&#xff0c;&#x5b88;&#x62a4;&#x7740;&#x90a3;&#x7fa4;&#x957f;&#x6c99;&#x571f;&#x592b;&#x5b50;&#x4ece;&#x53e4;&#x5893;&#x4e0d;&#x77e5;&#x540d;&#x602a;&#x7269;&#x636d;&#x4e2d;&#x62fc;&#x547d;&#x62a2;&#x51fa;&#x7684;&#x6218;&#x56fd;&#x5e1b;&#x4e66;&#x2026;&#x2026;</dd>
            </dl>

如何解决?


# tested under python3.4 def convert(s): s = s.strip('&#x;') # 把'&#x957f;'变成'957f' s = bytes(r'\u' + s, 'ascii') # 把'957f'转换成b'\\u957f' return s.decode('unicode_escape') # 调用bytes对象的decode,encoding用unicode_escape,把b'\\u957f'从unicode转义编码解码成unicode的'长'。具体参见codecs的文档 print(convert('&#x957f;')) # => '长'

全篇替换


import re print(re.sub(r'&#x....;', lambda match: convert(match.group()), ss))

全文替换后的结果:

<dt>学科主题:</dt>
            <dd><a href="openlink.php?keyword=%E9%95%BF%E7%AF%87%E5%B0%8F%E8%AF%B4">长篇小说</a>-中国-当代</dd>
        </dl>
                    <dl class="booklist">
            <dt>中图法分类号:</dt>
            <dd><a href="openlink.php?coden=I247.5">I247.5</a></dd>
        </dl>
                    <dl class="booklist">
            <dt>提要文摘附注:</dt>
            <dd>小说中的主人公,正是因为当年盗墓的爷爷人赘杭州而身在杭州,开了一家小的古董铺子,守护着那群长沙土夫子从古墓不知名怪物捭中拼命抢出的战国帛书……</dd>
        </dl>
# for python2.7

def convert(s):
    return ''.join([r'\u', s.strip('&#x;')]).decode('unicode_escape')

ss = unicode(ss, 'gbk') # convert gbk-encoded byte-string ss to unicode string

import re
print re.sub(r'&#x....;', lambda match: convert(match.group()), ss)

这个是 charref, HTML 的解析库都可以处理好, 不需要手工处理.
Python 标准库有 HTMLParser (html.parser in Python 3)
第三方库推荐 BeautifulSoup

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

胜博发娱乐Python在什么情况下会使用intern机制?intern机制和字符缓冲池的关系?

( 胜博发娱乐 )

最近正在看《python源码剖析》,在intern机制那一节的源码中,我看到在创建字符串对象时只有size=1时才会应用intern机制,其他情况并没有调用intern相关函数啊。
我在python解释器里试验了一下,

python a = 'string'
 b = string
 a is b

返回值是True
而把’string’换成'<\s’返回值就变成False了。到底什么情况下会用intern机制呢?
另外,单字符有字符对象池进行缓冲,为什么还要使用intern机制呢?两者之间是不是重复了呢?

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

胜博发娱乐python HTMLParse这个模块有什么用?

( 胜博发娱乐 )

看了这个模块的文档,只能解析一个标签的内容,那要是想获得嵌套标签里面的内容能实现吗?
貌似就解析单个标签意义不大啊

你说的是 HTMLParser 吧

parser就是一个parser,它无法帮你建一棵树,只会遍历节点。你需要自己处理嵌套关系,追踪当前路径。

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

sbf999胜博发官方网站python如何处理中英文混排的最长公共前缀?

( sbf999胜博发官方网站 )

比如:
str1 = "我是a good boy" str2 = "我是a bad boy"

两者的公共前缀为:我是a

其实我想说,如果楼主强调的是“中英文混排”这件事的话,那么如果两个字符串的同为unicode,或者采用了相同的字节编码方式的话,应该中英文混排这件事其实是没有区别的。

采用unicode时,每个汉字或者每个英文都是一个完整的字符;采用比如utf-8编码时,每个汉字是3个字节,每个英文是一个字节,那么依然不影响前缀的比较

转化為list

os.path.commonprefix((str1, str2))

def longestprefix(str1, str2):
    if str1 == str2:
        return str1
    return '' if str1[0] != str2[0] else str1[0] + longestprefix(str1[1:], str2[1:])

Python 3.4 测试可以, 2.x 没尝试

引自 os.path.commonprefix,参数可以是任意数量的list

def commonprefix(m):
    if not m: return ''
    s1 = min(m)
    s2 = max(m)
    for i, c in enumerate(s1):
        if c != s2[i]:
            return s1[:i]
    return s1

commonprefix(['我是a good boy', '我是a bad boy'])

如果只需要两个字符串,可以简化为

def commonprefix(s1, s2):
    for i, c in enumerate(s1):
        if c != s2[i]:
            return s1[:i]
    return s1

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…

胜博发娱乐Django 项目使用七牛,上传图片后如何获取错误信息?

( 胜博发娱乐 )

是这样的,我的 Django 网站上的用户需要直接传图片到七牛,
上传图片我已经处理好了,关键是上传的后续过程。
我把那个用户上传图片后重定向的 returnUrl = “http://localhost:8000/returnpage” 的view函数这么写:

import base64
import json
def return_page(request):
    domain = "ddkanhuo.qiniudn.com" #这是我的七牛空间地址
    ret = request.GET['upload_ret']  # 读取返回的upload_ret
    fileinfo = json.loads(base64.decodestring(ret))
    if fileinfo.get('error'):
        error_message = fileinfo['error']
        return render(request, 'return_page.html', {'error_message': error_message})
    else:
        key = fileinfo['key']
        public_url = 'http://'+ domain + '/' + key
        return render(request, 'return_page.html', {'public_url': public_url})

然后return_page.html大概是这样的(如果上传发生错误就显示错误消息,上传成功则显示图片):

<html>
.....
{% if error_message %}
        {{ error_message }}
{% else %}
        <p><img src="{{ public_url }}">
{% endif %}
.....
</html>

但是问题是呢,如果图片上传成功了,确实会按照预想的那样显示图片;
但是如果上传图片失败了,并不会显示错误消息,而会发生错误:
MultiValueDictKeyError at /returnpage/ "'upload_ret'"

这个应该怎么办,错误出在哪里的?
Django 新人求教,七牛的文档真是太难懂了…

我也是使用的django,我觉得我的项目没有必要主动上传到七牛,于是我使用了七牛的镜像功能,设置django的MEDIA_URL = ‘http://xxxx.qiniudn.com/media/‘。直接指向你的子域名,如(http://static.sample.com/)。镜像功能会主动去下载访问到的图片,不需要在程序里主动传到七牛,减少了很多上传失败的风险。缺点是有可能第一次访问该图片的时候速度稍慢,我觉得到是可以接受这个速度。
django项目里的图片如果做了修改,我的做法是在程序里向七牛提交删除key的指令,然后前台访问的时候加上版本参数,如:http://xxxx.qiniudn.com/media/123.jpg?v=123456,可以强制七牛刷新cdn缓存。缺点是好像刷新还是需要一点时间才能同步。

你好,能分享一下怎么在django中上传图片的代码吗? 弄了好久,图片都还上传不了。

今天我也遇到这个问题了,这么久了不知道你解决了没。图片上传出错后直接就没有upload_ret这个returnBody了,错误信息直接在url里显示出来了。

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

胜博发娱乐城关于编码:ansi、gbk、gb2312、utf8、utf16、utf32、Unicode

( 胜博发娱乐城 )

从接触编程以来,一直对编码的知识一知半解,总没有掌握精髓。
比如:ansi和gbk的关系,gbk和gb2312又有何关系,ansi和utf8有何区别,Unicode又和utf8是什么关系,以及ansi、gbk、gb2312、utf8(有无Bom之分)、utf16、utf32、Unicode之间的相互转换等等,心中的疑问总没有找个机会解决下,希望能在segmentfault得到满意的答案。


如果有这方面的书籍的话(javascript的最好了,因为刚好是在javascript中碰到的问题),最好不过了!


汇总

书籍
《fonts and encodings》只找到英文版
许令波的《深入分析Java Web技术内幕》3.3节

文章
字符编码笔记:ASCII,Unicode和UTF-8
谈谈Unicode编码
UNICODE,GBK,UTF-8区别
Unicode字符集和多字节字符集关系
谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
分析记事本写联通两字出现乱码的原因1
分析记事本写联通两字出现乱码的原因2
小代码大学问之JavaScript位运算

其他:
字体编辑用中日韩汉字Unicode编码表

ANSI是标准集,美国国家标准协会,涵盖多方面,类似大陆的国标
win下的ANSI是狭义的,指的是当前系统的编码,相当于code page

GB2312是国标,双字节字符集,但制定年份较早,包含的汉字(含标点符号等)较少
GBK是在GB2312的基础上扩展的,利用其中未被使用的码位,纳入更多的汉字和符号,所以一般情况下应该用GBK而不是GB2312。网页使用gb2312没问题是因为网页本身只是显示,取决于客户端的字体,即使超出gb2312编码范围的字符,只要字体包含就能显示,目前客户端的字体基本上都是足够显示gbk的,不会只有gb2312那么少字符,所以显示完全没问题。但编程时这两个就要分清楚,因为gb2312的字符数量少,容易造成转码错误,所以应该用gbk

unicode是字符集,其实是个码表,不是具体的编码,具体的编码是uc2,uc4,utf-7,utf-8,utf-16,utf-32等,uc是定长,每个字符字节数相同,utf是变长,字符视乎unicode的码位段字节数不同
windows下的unicode指的是utf-16,这样就有点混淆了概念
bom的概念是在文件最前面加上几个特定字节,以方便识别这是一个unicode某个编码的文本

编码间的转换一般用码表,这个一般如果不是研究,用现有的一些控件或接口就可以了,例如iconv等

深入分析Java Web技术内幕 许令波写的 3.3节
上面这书是我见过的对编码解释的最清晰的了 可以找找看看

推荐下阮一峰写的一篇入门的文章: http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

胜博发娱乐Python 程序在终端中是如何输出彩色字符的?

( 胜博发娱乐 )

今天看到一张截图,运行 python 文件后终端能够输出彩色的文本,不知道这个是如何实现的?

我是搬运工:

Print in terminal with colors using Python?

也可以用现成的模块colorama或者比较新的colorlog

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

胜博发娱乐城用 Python 生成的 md5 为什么跟 shell 生成的不一样?

( 胜博发娱乐城 )

python 代码:

import hashlib
h = hashlib.md5('helloworld')
print h.hexdigest()
---
输出:fc5e038d38a57032085441e7fe7010b0

shell 代码:

$> echo helloworld | md5
---
输出:d73b04b0e696b0945283defa3eee4538

echo默认会在字符串后面加上”\n”,可以用-n选项,如下:

➜  ~  echo -n helloworld | md5
fc5e038d38a57032085441e7fe7010b0

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

胜博发娱乐城插入数据库,单个插入有效,循环插入怎么就不行了?

( 胜博发娱乐城 )

def insert_into_bet(data):
    len_team_data = int(len(data)/7)
    conn=mdb.connect(host='localhost',user='root',passwd='oracle',db='betdb',port=3306)
    cur = conn.cursor()
    sql = "insert into bet(id,lea,gmd,hos,gue,hos_sco,gue_sco) values(%s,%s,%s,%s,%s,%s,%s)"
    for l in range(len_team_data):
        for item in data[7*l:7*l+1]:
            cur.executemany(sql,data[7*l:7*l+7])
            l+=1
    cur.close()
    conn.commit()
    conn.close()

if __name__=='__main__':
#     download_live_urls()
    now = datetime.datetime.now()
    now_date = now.strftime('%Y-%m-%d')
    pages_path = '/root/bet/teamUrls/%s' % now_date
    for page in os.listdir(pages_path):
        page_path = '/root/bet/teamUrls/%s/%s' % (now_date,page)
        #问题出在这里!!!
        insert_into_bet(from_page_to_data(page_path))
我尝试取消main里面的for循环,然后执行insert_into_bet这个,是可以插入数据库的,但是一旦加入for循环以后,就无法插入数据库了,不知道什么原因,求指点~

建议查看日志有没有报错,mysql配置打开global_log,看看sql执行情况

for
executemany

仔细看executemany的用法

def insert_into_bet(data):
len_team_data = int(len(data)/7)
conn=mdb.connect(host='localhost',user='root',passwd='oracle',db='betdb',port=3306)
cur = conn.cursor()
sql = "insert into bet(id,lea,gmd,hos,gue,hos_sco,gue_sco) values(%s,%s,%s,%s,%s,%s,%s)"
for l in range(len_team_data):
    for item in data[7*l:7*l+1]:
        cur.executemany(sql,data[7*l:7*l+7])
        l+=1
cur.close()
conn.commit()
conn.close()

顺序颠倒了~~
cur.close()
conn.commit()

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

胜博发娱乐城django可以实现不同数据库之前的实时备份吗?

( 胜博发娱乐城 )

数据库上不做任何多余的配置
通过django实现oracle和mysql数据库两个不同类型数据库之间的实时备份

不行,django不负责这个

(看完/读完)这篇文章有何感想! 胜博发娱乐城的分享…

sbf999胜博发官方网站eclipse java debug时的expression

( sbf999胜博发官方网站 )

Java新手。我在eclipse里面调试java代码时发现expression这个标签页并不怎么好用。比如这么一个小程序

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String notion = "{\"name\": \"Bill\", \"age\": 25, \"id\": \"1070329129\", \"friends\":[{\"name\": \"Eric\", \"age\": 30, \"id\": \"12345\"}, {\"name\": \"John\", \"age\": 33, \"id\": \"32154\"}]}";
        
        Gson gs = new Gson();
        
        people p = gs.fromJson(notion, people.class);
        
        
        System.out.println(p.getName());
        System.out.println(p.getAge());
        System.out.println(p.getId());
        List<people> temp = p.getFriends();
        
        for (int i = 0; i < p.getFriends().size(); i++) {
            System.out.println(p.getFriends().get(i));
        }

我在getFriends()那里断点。在expression标签中输入p.getFriends(), 提示

“temp.size()” <error(s)_during_the_evaluation>

难道一个变量在运行时我想调用一下它的方法都不行吗?还是应该怎么用?

谢谢。

你断点断在了temp变量申明的上面,这时候的expression里面引用temp变量当然是不存在的。
你在往下走两步,那个expression就会出现正确的值了.

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…

胜博发娱乐想用七牛做个小型网盘。有关于上传下载的问题不解!求教!

( 胜博发娱乐 )

1.文件不能重名怎么办? 两个人都上传一个叫做 周报的文件。 不能都让覆盖了!应该都可以上传都可以用。

我使用的是JAVA端上传方式。 form表单提交我的服务器,然后我的服务器提交给七牛。
Response res2 = uploadManager.put(b, ‘文件名’, getUpToken());

有什么方法可以让文件名不重复?

2.如果存储的文件名是不重复的字符串, 那么我下载的时候怎么可以让下载的文件是上传时候的名称。 当然我自己数据库中存的有上传时候的文件名。

还是我的思路不太对,有别的方法可以解决?

这么搞。用户1上传了1.txt,用户2也上传了1.txt,后台把这个1.txt重新命名成唯一字符串。存到/2016/03/30/17/njgfddsfhjjhv.txt,另一个存到 /2016/03/30/17/njgjjjjjjjjjjjhv.txt,数据库存一下源文件名和命名后的文件名和用户之间的关系。就ok了。

不同用户对应不同目录,用户可以在自己目录下创建目录。

(看完/读完)这篇文章有何感想! 胜博发娱乐的分享…

sbf999胜博发官方网站Mybatis的Select语句变量是大小写不敏感的吗?

( sbf999胜博发官方网站 )

今天遇到一个狗血的问题
使用springmvc+mybatis的时候
如一个SELECT语句如此


    <select id="list" parameterType="java.util.Map" resultMap="user">
        SELECT
        *
        FROM
        user
        <trim prefix="where" prefixOverrides="AND">

            <if test="username!=null">
                username = #{username}
            </if>
        
        </trim>
    </select> 
  
  

数据库为Mysql
假如我要搜索的usernamewanglaoju
那么我搜wanglaoju,WANGLAOJU,Wanglaoju都可以出现相同的结果。
Mybatis的搜索是大小写不敏感的吗?
如果不是,那么我这个可能是什么原因?

这个和Mybatis关系不大,说白了他到最后也是用JDBC驱动传递数据,和你手写JDBC传的SQL没啥区别。

这个是看你的数据库设置的,mysql默认是字段大小写不敏感的,通过配置文件可以修改。

mysql默认是不区分大小的

例如,一般查询:

Sql代码 收藏代码
SELECT * FROM U WHERE name LIKE ‘a%’;
SELECT * FROM U WHERE name LIKE ‘A%’;
其结果是一样的,为了区分’A%’和’a%’,可以这么做:

Sql代码 收藏代码
SELECT * FROM U WHERE binary name LIKE ‘a%’;
SELECT * FROM U WHERE binary name LIKE ‘A%’;
仅仅多了一个binary,就可以得到不同的结果!

当然,如果需要建表时强制区分大小写,可以这么写:

Sql代码 收藏代码
create table table_name(

 name varchar (20) binary      

);
就这么简单!

mysql大小写敏感和系统有关,推荐个库,log4jdbc,来打印下执行的sql,直接复制到数据库跑下看结果

<dependency>
    <groupId>com.googlecode.log4jdbc</groupId>
            <artifactId>log4jdbc</artifactId>
    <version>1.2</version>
</dependency>

因为你设置了这个吧

来个传送门 http://www.cnblogs.com/exmyth/p/3616672….

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…

sbf999胜博发官方网站springmvc不能扫描到Controller,报404?

( sbf999胜博发官方网站 )

applicationContext.xml
 <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"  
        xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd
            http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
            http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa-1.3.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd" >
    <!-- 定义支持注解的HanlderMapping -->
        <mvc:annotation-driven/>
        <!-- 开启组件扫描,启用IOC注解配置 -->
        <context:component-scan 
            base-package="com.caibai"/>
            
        <util:properties id="dbParams" 
            location="classpath:db.properties">
        </util:properties>
        
        <bean id="viewResolver" 
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/">
            </property>
            <property name="suffix" value=".jsp">
            </property>
        </bean>
        
    </beans>

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
 <servlet>
     <servlet-name>springmvc</servlet-name>
     <servlet-class>
 org.springframework.web.servlet.DispatcherServlet
     </servlet-class>
     <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:applicationContext.xml</param-value>
     </init-param>
     <load-on-startup>1</load-on-startup>
 </servlet>
 <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
     <url-pattern>*.form</url-pattern>
 </servlet-mapping>
 
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

LoginController.java

package com.caibai.controller;

import javax.annotation.Resource;
//import javax.ejb.Remove;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.caibai.search.User;
import com.caibai.search.UserService;

@Controller
public class LoginController {
    @Resource
    private UserService service;
    
    
    @RequestMapping("/tologin.form")
    public String toLogin(){
        return "login";
    }
    @RequestMapping("/login.form")
    public String login(
        String username,String number,Model model){
        User user = service.checkLogin(username,number);
        if(!"".equals(user.getCard())){
            model.addAttribute("name", user.getName());    
            model.addAttribute("card", user.getCard());    
            model.addAttribute("number", user.getNumber());    
            model.addAttribute("score", user.getScore());    
            return "ok";
        }else {
            model.addAttribute("msg", "会员信息错误!");
            return "login";
        }

    }
}

代码如上,页面访问login.jsp静态页面是可以的,但是填写上登陆数据不能跳转,直接访问login.form也是报404错误,请各位大神看下是什么原因?

找到症结所在了

我重新看了一下你的描述, 你说你可以直接访问.jsp页面!!!
那你的jsp就应该是直接放在根路径下的! 那你就不应该配置 prefix参数或者value="/"

而且之所以将view放置到WEB-INF下就只为了防止用户不经由控制器直接访问,这样会导致页面上的Model数据不存在,所以劝你也放到那里。
——————————————————————————————————

看起来配置都好像没什么问题, 建议你打个断点在.form方法里。

现在这个样子看起来像是Mapping映射成功了,但是返回的View视图没有找到
你确认一下/WEB-INF/ok.jsp/WEB-INF/login.jsp存不存在。

另外,我一般见到的 view好像没有直接扔到/WEB-INF/下的,都是/WEB-INF/views或者/WEB-INF/jsps目录下的。
你看看你是不是也这样放置的,如果是,那你就是配置文件写错了

<bean id="viewResolver"   class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/jsps/">
    </property>
    <property name="suffix" value=".jsp">
    </property>
</bean>

404一般有两个原因,一个是RequestMapping写的不对或者没有找到,但是你的配置应该是正确的,另一个是你的模板没有,确认一下你返回的两个模板ok.html login.html 或者ok.jsp ok.html是否存在吧
另外404的页面上会有提示到底是哪个原因,把具体的错误贴出来吧

@Controller下面没有@RequestMapping("/XXX")

<context:component-scan base-package="cn.com.xxx.xxx">
    <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>
</context:component-scan>

@ruixie说得比较正确了。
PS:补充一下,可以在controller要调用的方法中打个断点,看看请求是否进入了需要调用的方法。

  • 如果没进入,一般是配置映射出错。

  • 如果进入方法,则证明返回的”login”没被视图解析器解析到。

从配置文件来看是没有什么问题的,因为报的是404错误,说明这个URL找不到,可以先尝试debug一下,我猜想应该是能进入Controller层的,问题还得结合你整个工程来看,你可以先试试,再结合【堕天使008】的回答,查问题

应该是jsp目录不对,没找到jsp文件吧

可以先用JUnit测一下

404 Not Found: The requested resource could not be found(请求资源未找到)

LoginController 仅使用 @Controller,未结合使用 @ResponseBody 或者@RestController,说明使用 View 请求重定向方式。”/tologin.form”、”/login.form”是否映射监听成功,从应用启动日志就能看到,类似如下日志:

2016-04-12 23:29:35.157 INFO 2398 --- [main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/]}" onto public java.lang.String hello.HelloController.index()

而你配置的springmvc Servlet映射只监听*.form并不会监听*.jsp重定向的请求,这些请求会落到Tomcat conf/web.xml配置的default Servlet。jsp文件放在哪里?
这样修改试试:

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

(看完/读完)这篇文章有何感想! sbf999胜博发官方网站的分享…