从一个简单的小实例分析JSP+Servelt与JSP+Struts2框架的区别

最近在学struts2,struts2相比以前的JSP+Servlet,在处理流程上的更简单,我们就一个小实例来具体分析一下。

实例内容如下:

实现一个简单的注册页面包括:用户名、密码、重复密码、年龄、出生日期、毕业日期

要求如下:
用户名的长度在4-6之间
密码的长度在4-6之间
重复密码与密码相等
年龄在10-50之间
出生日期在毕业日期之前

输入错误返回原页面,并在原页面的文本框后面显示具体的错误信息。正确输入则跳入下个页面将信息显示出来。

1、JSP+Servlet

1)我们编写注册页面register.jsp

注册页面,不使用struts标签库的话,基本上大同小异,唯一的区别在form中action选项上,这里面的servlet自然要跳到RegisterServlet上进行相应的信息处理。我们先各自处理,然后再来比较吧。

[html] view plain copy

  1. <body>
  2. <h1>用户注册</h1>
  3. <form action="RegisterServlet" method="post">
  4. username:<input type="text" name="username"><br>
  5. password:<input type="password" name="password"><br>
  6. repassword:<input type="password" name="repassword"><br>
  7. age:<input type="text" name="age"><br>
  8. birthday:<input type="text" name="birthday"><br>
  9. graduate:<input type="text" name="graduate"><br>
  10. <input type="submit" value="submit">
  11. </form>
  12. </body>

2)因为这些属性都是属于注册用户的,我们再构建一个User类

[java] view plain copy

  1. private String username;
  2. private String password;
  3. private String repassword;
  4. private int age;
  5. private Date birthday;
  6. private Date graduate;
  7. public String getUsername() {
  8. return username;
  9. }
  10. public void setUsername(String username) {
  11. this.username = username;
  12. }
  13. public String getPassword() {
  14. return password;
  15. }
  16. public void setPassword(String password) {
  17. this.password = password;
  18. }
  19. public String getRepassword() {
  20. return repassword;
  21. }
  22. public void setRepassword(String repassword) {
  23. this.repassword = repassword;
  24. }
  25. public int getAge() {
  26. return age;
  27. }
  28. public void setAge(int age) {
  29. this.age = age;
  30. }
  31. public Date getBirthday() {
  32. return birthday;
  33. }
  34. public void setBirthday(Date birthday) {
  35. this.birthday = birthday;
  36. }
  37. public Date getGraduate() {
  38. return graduate;
  39. }
  40. public void setGraduate(Date graduate) {
  41. this.graduate = graduate;
  42. }

3)输入效验可以分为客户端效验和服务器端的效验,客户端的效验是将验证代码用javascript写到页面中,这里面我们统一用服务器端效验。编写RegisterServlet

[java] view plain copy

  1. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // TODO Auto-generated method stub
  3. //从页面传过来的数据都是字符形式的,我们要进行相应的转换
  4. String username=request.getParameter("username");
  5. String password=request.getParameter("password");
  6. String repassword=request.getParameter("repassword");
  7. int age=Integer.valueOf(request.getParameter("age"));
  8. String birthday=request.getParameter("birthday");
  9. String graduate=request.getParameter("graduate");
  10. Date graduate1=null;
  11. Date birthday1=null;
  12. Map<String, String> errors = new HashMap<String, String>();
  13. if (username == null)
  14. {
  15. errors.put("username", "用户名不能为空");
  16. } else
  17. {
  18. if (username.length()<4||username.length()>6)
  19. {
  20. errors.put("username", "用户名必须是4到6位");
  21. }
  22. }
  23. if (password == null)
  24. {
  25. errors.put("password", "密码不能为空");
  26. } else
  27. {
  28. if (password.length()<4||password.length()>6)
  29. {
  30. errors.put("password", "密码必须是4-6位数字");
  31. }
  32. }
  33. if (repassword ==null)
  34. {
  35. errors.put("repassword", "确认密码不能为空");
  36. } else
  37. {
  38. if (!(password.equals(repassword)))
  39. {
  40. errors.put("repassword", "确认密码必须与密码输入一致");
  41. }
  42. }
  43. if(age>50||age<10)
  44. {
  45. errors.put("age", "年龄无效");
  46. }
  47. if(birthday!=null)
  48. {
  49. DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
  50. try{
  51. birthday1=df.parse(birthday);
  52. }catch(Exception e)
  53. {
  54. errors.put("birthday", "日期格式不正确");
  55. }
  56. }else{
  57. errors.put("birthday", "生日不能为空");
  58. }
  59. if(graduate!=null)
  60. {
  61. DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
  62. try{
  63. graduate1=df.parse(graduate);
  64. }catch(Exception e)
  65. {
  66. errors.put("graduate", "日期格式不正确");
  67. }
  68. }else{
  69. errors.put("graduate", "毕业日期不能为空");
  70. }
  71. if(null!=graduate1&&null!=birthday1)
  72. {
  73. Calendar c1=Calendar.getInstance();
  74. c1.setTime(birthday1);
  75. Calendar c2=Calendar.getInstance();
  76. c2.setTime(graduate1);
  77. if(!c1.before(c2))
  78. {
  79. errors.put("graduate", "毕业日期出生日期不匹配");
  80. }
  81. }
  82. <span style="color:#FF0000;">if(errors.size()==0)
  83. {
  84. User user=new User();
  85. user.setUsername(username);
  86. user.setAge(age);
  87. user.setPassword(password);
  88. user.setRepassword(repassword);
  89. user.setBirthday(birthday1);
  90. user.setGraduate(graduate1);
  91. request.setAttribute("user", user);
  92. request.getRequestDispatcher("result.jsp").forward(request, response);
  93. }else
  94. {
  95. request.setAttribute("errors", errors);
  96. request.setAttribute("username", username);
  97. request.setAttribute("password",password);
  98. request.setAttribute("birthday", birthday);
  99. request.setAttribute("graduate",graduate);
  100. request.setAttribute("age",age);
  101. request.getRequestDispatcher("register.jsp").forward(request, response);
  102. }</span>
  103. }

4)然后我们编写一下result.jsp结果页面和修改一下register.jsp页面(出现错误后跳转,显示相应的错误信息)

result.jsp页面

[html] view plain copy

  1. <body>
  2. username:${user.username}<br>
  3. password:${user.password}<br>
  4. age:${user.age}<br>
  5. birthday:${user.birthday}<br>
  6. graduate:${user.graduate}<br>
  7. </body>

register.jsp修改后内容

[html] view plain copy

  1. <body>
  2. <h1>用户注册</h1>
  3. <form action="RegisterServlet" method="post">
  4. username:<input type="text" name="username" value="${username}">${errors.username}<br>
  5. password:<input type="password" name="password">${errors.password}<br>
  6. repassword:<input type="password" name="repassword">${errors.repassword}<br>
  7. age:<input type="text" name="age" value="${age}">${errors.age}<br>
  8. birthday:<input type="text" name="birthday" value="${birthday}">${errors.birthday}<br>
  9. graduate:<input type="text" name="graduate" value="${graduate}">${errors.graduate}<br>
  10. <input type="submit" value="submit">
  11. </form>

5)最后我们查看一下web.xml文件中,zai生成RegisterServlet时是否有相关的配置

[html] view plain copy

  1. <servlet>
  2. <description></description>
  3. <display-name>ReigsterServlet</display-name>
  4. <servlet-name>ReigsterServlet</servlet-name>
  5. <servlet-class>ReigsterServlet</servlet-class>
  6. </servlet>
  7. <servlet-mapping>
  8. <servlet-name>ReigsterServlet</servlet-name>
  9. <url-pattern>/RegisterServlet</url-pattern>
  10. </servlet-mapping>

Ok,到这上面描述的Jsp+Servlet的基本功能都已实现,RegisterServlet作为整个代码的核心,写的是很长的。其实我们可以优化一下,将判断的内容放在formbean类中,然后在servlet中判调用。但是代码量是不减的,只能是让逻辑业务更清晰。

2、用Struts框架来实现以上功能。

1)首先struts的基本配置省略,可以参考http://blog.csdn.net/fumier/article/details/44626461

2)编写register.jsp页面,这里面使用了struts标签库,需要在开头第二行加入( <%@ taglib prefix="s" uri="/struts-tags"%>)

[html] view plain copy

  1. <s:form action="register.action" theme="simple"><br>
  2. username:<s:textfield name="username" label="username"></s:textfield><br>
  3. password:<s:password name="password" label="password"></s:password><br>
  4. repassword:<s:password name="repassword" lable="repassword"></s:password><br>
  5. age:<s:textfield name="age" label="age"></s:textfield><br>
  6. birthday:<s:textfield name="birthday" label="birthday"></s:textfield><br>
  7. graduate:<s:textfield name="graduate" label="age"></s:textfield><br>
  8. <s:submit value="submit"></s:submit>
  9. </s:form>

3)接下来我们编写RegisterAction类

[java] view plain copy

  1. public class RegisterAction extends ActionSupport {
  2. private String username;
  3. private String password;
  4. private String repassword;
  5. private int age;
  6. private Date birthday;
  7. private Date graduate;
  8. public String getUsername() {
  9. return username;
  10. }
  11. public void setUsername(String username) {
  12. this.username = username;
  13. }
  14. public String getPassword() {
  15. return password;
  16. }
  17. public void setPassword(String password) {
  18. this.password = password;
  19. }
  20. public String getRepassword() {
  21. return repassword;
  22. }
  23. public void setRepassword(String repassword) {
  24. this.repassword = repassword;
  25. }
  26. public int getAge() {
  27. return age;
  28. }
  29. public void setAge(int age) {
  30. this.age = age;
  31. }
  32. public Date getBirthday() {
  33. return birthday;
  34. }
  35. public void setBirthday(Date birthday) {
  36. this.birthday = birthday;
  37. }
  38. public Date getGraduate() {
  39. return graduate;
  40. }
  41. public void setGraduate(Date graduate) {
  42. this.graduate = graduate;
  43. }
  44. @Override
  45. public String execute() throws Exception {
  46. // TODO Auto-generated method stub
  47. System.out.println("execute()");
  48. return SUCCESS;
  49. }
  50. @Override
  51. public void validate() {
  52. // TODO Auto-generated method stub
  53. System.out.println("validate()");
  54. if(null==username||username.length()<4||username.length()>6)
  55. {
  56. this.addFieldError("username","用户名无效");
  57. }
  58. if(null==password||password.length()<4||password.length()>6)
  59. {
  60. this.addFieldError("password","密码无效");
  61. }else if(null==repassword||repassword.length()!=password.length())
  62. {
  63. this.addFieldError("repassword","密码长度不一致");
  64. }else if(!repassword.equals(password))
  65. {
  66. this.addFieldError("repassword","密码不一致");
  67. }
  68. if(age<10||age>50)
  69. {
  70. this.addFieldError("age","年龄无效");
  71. }
  72. if(null==birthday)
  73. {
  74. this.addFieldError("birthday","出生日期为空");
  75. }
  76. if(null==graduate)
  77. {
  78. this.addFieldError("graduate","毕业日期为空");
  79. }
  80. if(null!=graduate&&null!=birthday)
  81. {
  82. Calendar c1=Calendar.getInstance();
  83. c1.setTime(birthday);
  84. Calendar c2=Calendar.getInstance();
  85. c2.setTime(graduate);
  86. if(!c1.before(c2))
  87. {
  88. this.addFieldError("graduate","毕业日期出生日期不匹配");
  89. }
  90. }
  91. }
  92. }

4)配置struts.xml文件

[html] view plain copy

  1. <action name="register" class="cn.sict.register.RegisterAction">
  2. <result name="success">/result.jsp</result>//正确就跳转到result.jsp
  3. <result name="input">/register.jsp</result>//错误就跳转到register.jsp
  4. </action>

5)result.jsp与1中的相同,至此,就完成了所有的功能。

接下来,我们来看一下,使用struts框架,我们省略了哪些工作。

1)首先没有set/get方法了。

2)没有了servlet中从页面获得字符,然后再转换为需要的类型,然后简单的配置相应的result参数,就可以跳转到相应的页面。

3)继承了ActionSupport类重写validate()方法,使逻辑清晰。

Struts对上述的操作进行了包装,提高了程序的课重用性,我们只需要修改少量的参数和配置文件,就可以达到想要的效果。

时间: 2024-10-13 13:36:29

从一个简单的小实例分析JSP+Servelt与JSP+Struts2框架的区别的相关文章

一个简单的HTML病毒分析

一直就想写这篇东西了,只是上班时说要上班,不写,回家后又忙着玩游戏,丢一边去了.现在只好不务正业的开写了,希望头儿不会知道我的blog.哈哈 在很久之前就对HTML的病毒很感兴趣了,很好奇怎么能远程向本地不经过允许就能下载可执行文件的,只是一直没机会搞得到ASP的原码,所以不才敢断章取义的去作什么分析.最近一次听一朋友说他看一个网页时病毒防火墙提示有病毒,叫我小心(先感谢一下他先),我闪了一下念头,就打开FlashGet把那个病毒首页下了下来. 稍微看了一下发现在首页代码的下面几行里有一个隐含的

一个简单的小例子让你明白c#中的委托-终于懂了!

模拟主持人发布一个问题,由多个嘉宾来回答这个问题. 分析:从需求中抽出Host (主持人) 类和Guests (嘉宾) 类. 作为问题的发布者,Host不知道问题如何解答.因此它只能发布这个事件,将事件委托给多个嘉宾去处理.因此在Host 类定义事件,在Guests类中定义事件的响应方法.通过多番委托的"+="将响应方法添加到事件列表中,最终 Host 类将触发这个事件.实现过程如下: 代码其实很少下面贴出来所有代码: QuestionArgs.cs view plaincopy to

Java Tread多线程(0)一个简单的多线程实例

作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多线程时,一般步骤: 1)继承Thread函数. 2)覆盖run函数. 注意:1)main函数为主线程,main里面存放的是主线程的执行代码: Demo1为子线程,里面的run函数里面存放的是子线程需要执行的代码:其中,本文中主线程和子线程执行的优先级是一样的. 2)启动线程必须用start()启动,

Cocos2d-X开发一个简单的小游戏

学了这么久Cocos2d-X,今天终于可以做出一个简单的小游戏了,游戏非常简单,通过菜单项控制精灵运动 在做游戏前,先学一个新概念 调度器(scheduler): Cocos2d-x调度器为游戏提供定时事件和定时调用服务.所有Node对象都知道如何调度和取消调度事件,使用调度器有几个好处: 每当Node不再可见或已从场景中移除时,调度器会停止. Cocos2d-x暂停时,调度器也会停止.当Cocos2d-x重新开始时,调度器也会自动继续启动. Cocos2d-x封装了一个供各种不同平台使用的调度

【CentOS】一个简单的Expect实例详解

Expect是基于Tcl的相对简单的一个免费的基本变成工具语言,用于实现自动和交互式任务程序进行通信,无须人工干预. 一.Expect的安装检查与Linux系统的实验环境 1.Expect的安装 [[email protected]]# rpm -qa expect expect-5.43.0-8.el5 expect-5.43.0-8.el5 #如果未安装expect,可以通过yum进行安装 [[email protected]]# yum install expect -y 2.Linux的

输出多行字符的一个简单JAVA小程序

1 public class JAVA 2 { 3 public static void main(String[] args) 4 { 5 System.out.println("----------------------"); 6 System.out.println("|| 我要学会 ||"); 7 System.out.println("|| JAVA语言 ||"); 8 System.out.println("-------

一个简单的backbone实例(基于139邮箱)

先看一下效果图: 代码如下: <!doctype html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>邮箱前端实现</title> <style type="text/css"> *{

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //

Ajax学习(二)—— 一个简单的Ajax实例

通过上篇博客认识Ajax之后,我们通过一个简单的实例来消化消化理论知识,一睹Ajax的庐山真面目. 1.实例功能: 当用户输入用户名,文本框失去焦点后,通过异步调用来判断该用户名是否已经存在.若存在,则在上图中红框处显示提示.当用户名可用时,提交按钮变为可用状态. 2.设计Html页面: <span style="font-family:SimSun;font-size:18px;"><strong><span style="font-famil