• 从一个简单的小实例分析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.                       
    31.                     errors.put("password", "密码必须是4-6位数字");  
    32.                 }  
    33.             }  
    34.             if (repassword ==null)  
    35.             {  
    36.                 errors.put("repassword", "确认密码不能为空");  
    37.             } else  
    38.             {  
    39.                 if (!(password.equals(repassword)))  
    40.                 {  
    41.                     errors.put("repassword", "确认密码必须与密码输入一致");  
    42.                 }  
    43.             }  
    44.             if(age>50||age<10)  
    45.             {  
    46.                 errors.put("age", "年龄无效");  
    47.             }  
    48.             if(birthday!=null)  
    49.             {  
    50.                 DateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
    51.                   
    52.                 try{  
    53.                     birthday1=df.parse(birthday);  
    54.                 }catch(Exception e)  
    55.                 {  
    56.                     errors.put("birthday", "日期格式不正确");  
    57.                 }  
    58.             }else{  
    59.                 errors.put("birthday", "生日不能为空");  
    60.             }  
    61.             if(graduate!=null)  
    62.             {  
    63.                 DateFormat df=new SimpleDateFormat("yyyy-MM-dd");  
    64.                   
    65.                 try{  
    66.                     graduate1=df.parse(graduate);  
    67.                 }catch(Exception e)  
    68.                 {  
    69.                     errors.put("graduate", "日期格式不正确");  
    70.                 }  
    71.             }else{  
    72.                 errors.put("graduate", "毕业日期不能为空");  
    73.             }  
    74.             if(null!=graduate1&&null!=birthday1)  
    75.             {  
    76.               Calendar c1=Calendar.getInstance();  
    77.               c1.setTime(birthday1);  
    78.               Calendar c2=Calendar.getInstance();  
    79.               c2.setTime(graduate1);  
    80.               if(!c1.before(c2))  
    81.               {  
    82.                   errors.put("graduate", "毕业日期出生日期不匹配");  
    83.               }  
    84.             }  
    85.         <span style="color:#FF0000;">if(errors.size()==0)  
    86.         {  
    87.             User user=new User();  
    88.             user.setUsername(username);  
    89.             user.setAge(age);  
    90.             user.setPassword(password);  
    91.             user.setRepassword(repassword);  
    92.             user.setBirthday(birthday1);  
    93.             user.setGraduate(graduate1);  
    94.             request.setAttribute("user", user);  
    95.             request.getRequestDispatcher("result.jsp").forward(request, response);  
    96.         }else  
    97.         {  
    98.             request.setAttribute("errors", errors);  
    99.             request.setAttribute("username", username);  
    100.             request.setAttribute("password",password);  
    101.             request.setAttribute("birthday", birthday);  
    102.             request.setAttribute("graduate",graduate);  
    103.             request.setAttribute("age",age);  
    104.             request.getRequestDispatcher("register.jsp").forward(request, response);      
    105.               
    106.         }</span>  
    107.           
    108.     }  


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

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

  • 相关阅读:
    WinForm企业应用框架设计【五】系统登录以及身份验证+源码
    利用windows性能计数器进行服务器性能监控
    WinForm企业应用框架设计【一】界限划分与动态创建WCF服务(no svc!no serviceActivations!)
    杭州驾驶员模拟预约 监控工具 插队工具(准) 请直接联系作者 QQ 412588801
    使用plot绘制实时图表
    SilverLight企业应用框架设计【二】框架画面
    服务器性能监控+邮件发送
    自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!
    SilverLight企业应用框架设计【四】实体层设计+为客户端动态生成服务代理(自己实现RiaService)
    使用plot绘制可联动的柱状图和饼状图
  • 原文地址:https://www.cnblogs.com/jay36/p/7515674.html
Copyright © 2020-2023  润新知