jsp+servlet学生信息查询系统小结

之前从学校网站上分别获取到了新生的个人资料以及照片,因此想用jsp+servlet做个类似搜索引擎根据关键字查询信息的系统。
大致想法是用户提交关键字,然后返回所有包含关键字的学生信息,粗略想想应该蛮简单的,不过在实际做的过程中还是遇到各种问题,简单记录下遇到的问题和解决方法。

1.最初遇到的问题就是数据库模糊匹配的问题,用户提交的关键字数量不定,而每个字段都有可能包含任一个关键字,也就是说,假如用户提交了m个关键字,数据库有n个字段,那最麻烦的办法是每个关键字都要在每个字段里查询下是不是会出现,如果每个查询算一个语句,那共有m*n个语句用逻辑词and或or合在一起作为查询出结果,这可以实现但显然很低效很麻烦(我的学生信息大概有15个字段)。网上搜索了下,这个好像叫多关键字多字段模糊匹配问题,然后看到mysql貌似提供全文索引Full-Text的功能,不过看了一篇介绍写了一大堆,还很多限制什么的,就没考虑用,最后干脆就再加了个字段,把所有前面的字段都合在一起放到最后一个字段,要查只要在最后一个字段查就行了,反正每个字段很短,就凑合着用这方法。

2.Excel中把前面所有列内容合并在一起放入新建的最后一列,比如A、B、C要合并写入D列可以选中D1,输出=A1&B1&C1然后下拉到最后一行即可。

3.乱码问题在整个过程中遇到好多次。
情况一:mysql全设为utf-8,navicat查看正常,dos界面显示乱码,且无法插入中文。
解决:命令行下不支持utf-8,可以用set names gbk再插入中文

情况二:mysql全设为gbk,jsp也全部gbk,传递中文参数仍然乱码
解决:jsp在接收到参数后用getBytes转换下
String originalWords=request.getParameter("wd");
words=new String(originalWords.getBytes("ISO-8859-1"),"GBK");

4.sql语句绝对正确,但含某个字段无法查询,很可能该字段的名字用了关键字,比如fulltext、all

5.类似搜索引擎,将查询结果分页显示,具体见此文http://blog.csdn.net/prstaxy/article/details/7875249

6.提交表单后让文本框保留内容
解决:设置一个queryContent,request提交后用getParameter获取其值,文本框的value=<%=queryContent%>,如果getParameter取得的是null则让其等于空字符串""即可,为了不让中文乱码,需queryContent=new String(request.getParameter("wd").getBytes("ISO-8859-1"),"GBK");。

但是这样又有新的问题,如果内容中含有空格,那只会留下空格前面的内容,而空格后面的会丢失
解决:在getParameter后,把所有空格换成&nbsp;
if(queryContent.indexOf(" ")>0)
   queryContent=queryContent.replaceAll(" ","&nbsp;"); 

这样的话,在文本框就可以保留全部内容了,但是在服务器端接收到提交的字符串时也需要用words=words.replaceAll("&nbsp;", " ");恢复空格
另外,ie和谷歌浏览器似乎对空格编码不同,经过测试会变成&#160;故需要2次,也许别的浏览器还有其他的话,那也要考虑。
words=words.replaceAll("&nbsp;", " ");
words=words.replaceAll("&#160;", " ");

7.自定义404页面在IE浏览器不能显示,网上找到的说明是:IE对自定义的404页面大小必须大于512字节,否则IE浏览器会使用其自带的404页面代替。

8.鼠标放到超链接显示提示信息,设置title字段,<a href= " " title="提示信息">点击</a>

9.jsp自定义404页面,在所在工程的WEB-INF下的web.xml页面中进行配置如下
<error-page>
    <error-code>404</error-code>
    <location>/error.jsp</location>
</error-page>

10.tomcat换成80端口访问,在tomcat安装目录下conf文件夹下的server.xml里 设置
  <Connector   port= "8080 " 将8080改成80即可

11.获取request的时间以及对方的IP地址,并追加写入到文件中

String userInfo=new String((new SimpleDateFormat("MM-dd HH:mm:ss").format(new Date())+" "+"IP:"+request.getRemoteAddr();

		try 
		{
			String fileName="D:\\tomcat\\webapps\\ROOT\\record.txt";
			FileWriter fw = new FileWriter(fileName, true);
			// 追加内容
			fw.write(userInfo+System.getProperty("line.separator"));
			// 关闭文件输出流
			fw.close();

		} catch (Exception e) {
			System.out.println("file write error:" + e);
		}

你可能感兴趣的:(tomcat,mysql,exception,搜索引擎,String,浏览器)