Servlet试手_简易微博

需求:

想做一个非常简陋的微博

有用户登录、注册、注销、修改个人信息功能(用xml记录)

登录的用户可以查看所有人发表的Blog,并进行评论(自己发表的Blog可以删除)

---------------------------------------------------------------------------

用eclipse创建Dynamic Web Project,发现创建后没有web.xml这个文件了,和平时学习的时候不一样,不习惯,于是上网查找一下,发现创建项目的时候不要直接点击Finish,点击Next直到最后,有一个创建web.xml的选择,勾选它然后再完成创建就发现web.xml出来了。




这是大致的代码结构,大概是用MVC架构吧,对这个不是很熟悉,不过觉得这样进行开发的话代码不是很乱,不像以前所有功能都放在一个类里面,修改起来太麻烦。


不过开发技术不够就是不够,在修改web.xml这个文件的时候出现了困难。
添加了这段解释后tomcat7.0就无法运行了,把这段文字去掉后就可以正常运行
  <servlet>
  <servlet-name>Controller</servlet-name>
<servlet-class>controller.ClientServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  <servlet-name>ClientServlet</servlet-name>
  <url-pattern>/servlet/ClientServlet</url-pattern>
  </servlet-mapping>
现在正在找问题的关键,并进行修改。



很快,我又找到了自己犯的非常愚蠢的错误时什么,其实主要就是自己对web.xml的配置太不熟悉,现在配置好了,进行下一步的“开发”。


login.html的页面是这样配置的,但是这样点击了login之后出现了404页面,正在查找问题。

经过自己用浏览器测试,发现是点击login之后页面并没有像预计中跳到http://localhost:8080/blogg/servlet/ClientServlet的页面,而是跳到了http://localhost:8080/blogg/ClientServlet的页面,中间少了/servlet,现在正在查找原因是什么。

好吧,真的是被自己的无知打败了,其实就是自己并没有真正认识到<servlet-mapping>的意思,不知道<servlet>这些东西是怎么运作的,现在可以画一画图来认识并巩固一下。
嗯,这个就是我对web.xml servlet映射的理解,如果有网友指出其中的错误,感激不尽。
好了,下面做接下来的“开发”。

实现非常简陋也暂时没有认证的用户注册,但是即使非常简陋也会出现问题,在这里我出现的问题是中文数据写入xml,在xml中出现了乱码:
嗯,就是这样的,于是又开始找问题的所在以及解决问题。原来这个问题是这么的简单,我只需要在post的方法下req.setCharacterEncoding("UTF-8");就解决了html传回来的中文乱码问题。因为我在html的编码是UTF-8,但是客户端默认的编码是ISO-8859-1,所以显示出来的字元就不正确了。这里是参考http://openhome.cc/Gossip/Encoding/Servlet.html的经验,十分感谢。

在注册和登录之后跳转的页面中,我用了一个转发的功能,就是跳转到一个有信息的页面,然后2秒钟后跳转回来:
req.setAttribute("message", message+"<meta http-equiv='Refresh' content='2;URL="+req.getContextPath()+"/login.html'/>");
req.getRequestDispatcher("message.jsp").forward(req, resp);


终于一路过关斩将,完成了用户的注册 登录 修改功能,现在在处理主页面的情况,但是在用jsp script 处理xml文档的时候出现了一些问题,想获取xml的document对象,用xmlhttp.responseText 是能够alert出xml文档的全文的,但是用xmlhttp.responseXML的值却为null,这里是什么情况呢?再次google baidu:

一路过关斩将,发现可能是IE不支持这样的xml解析方式,后来我增加了谷歌浏览器的解析方式:
决定先用谷歌浏览器进行调试,毕竟谷歌浏览器是大众浏览器,先完成后续功能再想办法调整IE的xml解析吧。



嗯,然后现在的主页面就是这个丑样子,待我完善一下评论,删除个发表的功能。
新遇到个小问题,在jsp页面中怎么获取用户名呢?在jsp页面中用户名的信息是存在与服务器上的,应该是session,然后js是客户端,要从客户端获得服务器上的信息的语法是什么我不清楚,不过从网上查到的语法大概是这样的:
var userName = "<%=session.getAttribute("userName")%>";
但很可惜获得的值是null,再找找是什么问题。
于是很快我就意识到了原因,是我没有把userName放到session,于是在login方法里增加了
HttpSession session = req.getSession();
修改了
session.setAttribute("userName", user.getUserName());
就可以获得用户名了。

之后又是小问题不断,在HTML字符串转义上遇到了问题。
这里的<br>是想换行的,但是<>以字符串的形式传进来就变成了转移的&lt &gt了,该怎么解决呢?

最后面的解决方法是这样的,因为之前把文本直接放在了tr的标签下,其实这样做是很不好的,之前是:
<tr>root:这是微博正文,发言人是root<td>评论</td><td>删除</td></tr>
现在是:
<tr><td>root:这是微博正文,发言人是root</td><td>评论</td><td>删除</td></tr>
还是变成经验不足,很多小毛病。
现在的新问题是,
<form>...<input type="button" value="text" onclick=text(this)</form>
表单中的button onclick事件无法调用,移出表单可以调用,怎么解决呢?
经过网上查询知道,表单的submit就相当于占用了了一个onclick属性,所以重复了,不能这样使用,于是换一下思路,增多一个表单来完成同步。
之后文本信息就能够以字符串的形式从jsp传到servlet,在java中接受到字符串,但是字符串怎么转为xml呢?这里有一个方法很好用。
这样就可以把字符串中的标签不转义存入xml文件里面了,不过还是有一个问题,这样存入xml文档后,原来标签中的attribute由大写转为了小写,
 所以我以后也会改变一下习惯,xml中的attribute全部用小写,以免发生麻烦。


前面遇到过有浏览器不兼容的问题,经过问朋友和查询资料,觉得还是使用jQuery比较合适,于是把页面改为jquery。

问题总是有的,现在的问题是,页面信息同步到xml中,再从xml中同步数据下来,有时候不能马上同步,而且刷新页面会出现重复提交的情况。

评论

热门博文