前面的《Eclipse创建带JavaBean的JSP程序》文章中,介绍了如何在留言簿程序中使用JavaBean和JSP,其中重要的代码逻辑都放在了JSP文件中,例如用户注册信息处理、用户登录信息验证、用户留言处理等。这么做的不足之处主要包括修改代码不方便,代码复用度不高。这段时间在看《Head First Servlets and JSP》,书中对MVC的初步介绍中也在说可以使用JSP+Servlet+JavaBean实现MVC,其中Model对应JavaBean,View对应JSP,Controller对应Servlet。
本文在留言簿项目中增加Servlet技术,并将JSP文件中的代码逻辑放在Servlet和JavaBean中,使JSP文件主要负责数据展示。
程序实现
主要创建三个Servlet:RegisterServlet、LoginServlet和MessageServlet。在项目上点右键,选择New->Other,在新建窗口中的Web文件夹下找到Servlet,然后点击下一步按钮。
然后设置Servlet的命名空间、类名等属性,自建的Servlet一般都是从HTTPServlet类派生的,这里不用改超类名字。
然后是设置Servlet的映射地址,这里的映射地址是客户端访问Servlet时使用的地址。按照《Head First Servlets and JSP》书中的介绍(推荐各位看看这本书,写的很浅显易懂),一个Servlet有三个名字:物理文件名,类名和映射名,一看这三个名字就知道是什么意思,这里就不解释了。个人根据映射名就像是艺名,通过设置艺名,让客户端只知道艺名,不用管Servlet的真实名字,这样不仅安全,后续Servlet发生变化对客户端影响也小。点击下一步按钮,继续进行设置。
最后一步是设置Servlet中要复写的函数,这里主要是doPost和doGet,其它函数暂时用不到,点击结束按钮完成Servlet创建。
同理创建LoginServlet和MessageServlet。这三个Servlet类与映射URL的配置关系是通过在Servlet类前放置@WebServlet实现的,采用的是Servlet的新特性,对该新特性的说明请参照文献5-6。没有这个新特性时,映射关系一般是放在web.xml文件中的,该文件默认放在WEB-INF文件夹中。之前创建项目时没有勾选自动创建web.xml选项,因此只有手动添加。查看网上文章,添加web.xml文件要么是从其它地方复制一个到WEB-INF文件夹内,要不就在项目上点右键,然后选择Java EE Tools->Generate Deployment Descriptor Stub自动产生一个新的。
使用LoginServlet替代deal.jsp的功能,主要代码如下:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
//response.getWriter().append("Served at: ").append(request.getContextPath());
ServletContext application = this.getServletContext();
UserBuffer userBuffer=(UserBuffer)application.getAttribute("users");
if(userBuffer==null)
{
userBuffer=new UserBuffer();
application.setAttribute("users", userBuffer);
}
User user=new User();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
if(userBuffer.ValidateUser(user))
{
request.getRequestDispatcher("messageboard.jsp").forward(request,response);
}
else
{
response.sendRedirect("error.jsp");
}
}
保留registerresult.jsp,但是将其中的处理代码放在RegisterServlet中。
ServletContext application = this.getServletContext();
UserBuffer userBuffer=(UserBuffer)application.getAttribute("users");
if(userBuffer==null)
{
userBuffer=new UserBuffer();
application.setAttribute("users", userBuffer);
}
User user=new User();
user.setName(request.getParameter("name"));
user.setPassword(request.getParameter("password"));
user.setEmail(request.getParameter("email"));
String isRegistered=userBuffer.IsUserRegisiterd(user.getName())?"Y":"N";
application.setAttribute("isRegistered", isRegistered);
response.sendRedirect("registerresult.jsp");
将messageboard.jsp中汇总留言的代码放到messageservlet中,并将messageboard.jsp中提交留言的action设置为messageservlet:
ServletContext application = this.getServletContext();
String msg=request.getParameter("msg");
String allMsgs="";
if(msg!=null)
{
allMsgs=(String)application.getAttribute("messages");
if(allMsgs==null)
{
allMsgs=msg;
}
else
{
allMsgs+="<br>"+msg;
}
application.setAttribute("messages", allMsgs);
}
request.getRequestDispatcher("messageboard.jsp").forward(request,response);
最终的程序效果和之前差不多,就不贴界面了。整个程序的代码放在了GitHub上,地址为:https://github.com/guochao2299/SimpleMessageBoard/tree/20200517
参考文献:
[1]Java Web设计实用教程
[2]Java Web从入门到精通
[3]JSP程序设计与案例教程
[4]Head First Servlets and JSP
[5]https://www.zhihu.com/question/41914148
[6]https://blog.csdn.net/weixin_42442713/article/details/84142832