从一个简单的小实例分析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上进行相应的信息处理。我们先各自处理,然后再来比较吧。
- <body>
- <h1>用户注册</h1>
- <form action="RegisterServlet" method="post">
- username:<input type="text" name="username"><br>
- password:<input type="password" name="password"><br>
- repassword:<input type="password" name="repassword"><br>
- age:<input type="text" name="age"><br>
- birthday:<input type="text" name="birthday"><br>
- graduate:<input type="text" name="graduate"><br>
- <input type="submit" value="submit">
- </form>
- </body>
2)因为这些属性都是属于注册用户的,我们再构建一个User类
- private String username;
- private String password;
- private String repassword;
- private int age;
- private Date birthday;
- private Date graduate;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getRepassword() {
- return repassword;
- }
- public void setRepassword(String repassword) {
- this.repassword = repassword;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public Date getGraduate() {
- return graduate;
- }
- public void setGraduate(Date graduate) {
- this.graduate = graduate;
- }
3)输入效验可以分为客户端效验和服务器端的效验,客户端的效验是将验证代码用javascript写到页面中,这里面我们统一用服务器端效验。编写RegisterServlet
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- // TODO Auto-generated method stub
- //从页面传过来的数据都是字符形式的,我们要进行相应的转换
- String username=request.getParameter("username");
- String password=request.getParameter("password");
- String repassword=request.getParameter("repassword");
- int age=Integer.valueOf(request.getParameter("age"));
- String birthday=request.getParameter("birthday");
- String graduate=request.getParameter("graduate");
- Date graduate1=null;
- Date birthday1=null;
- Map<String, String> errors = new HashMap<String, String>();
- if (username == null)
- {
- errors.put("username", "用户名不能为空");
- } else
- {
- if (username.length()<4||username.length()>6)
- {
- errors.put("username", "用户名必须是4到6位");
- }
- }
- if (password == null)
- {
- errors.put("password", "密码不能为空");
- } else
- {
- if (password.length()<4||password.length()>6)
- {
- errors.put("password", "密码必须是4-6位数字");
- }
- }
- if (repassword ==null)
- {
- errors.put("repassword", "确认密码不能为空");
- } else
- {
- if (!(password.equals(repassword)))
- {
- errors.put("repassword", "确认密码必须与密码输入一致");
- }
- }
- if(age>50||age<10)
- {
- errors.put("age", "年龄无效");
- }
- if(birthday!=null)
- {
- DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
- try{
- birthday1=df.parse(birthday);
- }catch(Exception e)
- {
- errors.put("birthday", "日期格式不正确");
- }
- }else{
- errors.put("birthday", "生日不能为空");
- }
- if(graduate!=null)
- {
- DateFormat df=new SimpleDateFormat("yyyy-MM-dd");
- try{
- graduate1=df.parse(graduate);
- }catch(Exception e)
- {
- errors.put("graduate", "日期格式不正确");
- }
- }else{
- errors.put("graduate", "毕业日期不能为空");
- }
- if(null!=graduate1&&null!=birthday1)
- {
- Calendar c1=Calendar.getInstance();
- c1.setTime(birthday1);
- Calendar c2=Calendar.getInstance();
- c2.setTime(graduate1);
- if(!c1.before(c2))
- {
- errors.put("graduate", "毕业日期出生日期不匹配");
- }
- }
- <span style="color:#FF0000;">if(errors.size()==0)
- {
- User user=new User();
- user.setUsername(username);
- user.setAge(age);
- user.setPassword(password);
- user.setRepassword(repassword);
- user.setBirthday(birthday1);
- user.setGraduate(graduate1);
- request.setAttribute("user", user);
- request.getRequestDispatcher("result.jsp").forward(request, response);
- }else
- {
- request.setAttribute("errors", errors);
- request.setAttribute("username", username);
- request.setAttribute("password",password);
- request.setAttribute("birthday", birthday);
- request.setAttribute("graduate",graduate);
- request.setAttribute("age",age);
- request.getRequestDispatcher("register.jsp").forward(request, response);
- }</span>
- }
4)然后我们编写一下result.jsp结果页面和修改一下register.jsp页面(出现错误后跳转,显示相应的错误信息)
result.jsp页面
- <body>
- username:${user.username}<br>
- password:${user.password}<br>
- age:${user.age}<br>
- birthday:${user.birthday}<br>
- graduate:${user.graduate}<br>
- </body>
register.jsp修改后内容
- <body>
- <h1>用户注册</h1>
- <form action="RegisterServlet" method="post">
- username:<input type="text" name="username" value="${username}">${errors.username}<br>
- password:<input type="password" name="password">${errors.password}<br>
- repassword:<input type="password" name="repassword">${errors.repassword}<br>
- age:<input type="text" name="age" value="${age}">${errors.age}<br>
- birthday:<input type="text" name="birthday" value="${birthday}">${errors.birthday}<br>
- graduate:<input type="text" name="graduate" value="${graduate}">${errors.graduate}<br>
- <input type="submit" value="submit">
- </form>
5)最后我们查看一下web.xml文件中,zai生成RegisterServlet时是否有相关的配置
- <servlet>
- <description></description>
- <display-name>ReigsterServlet</display-name>
- <servlet-name>ReigsterServlet</servlet-name>
- <servlet-class>ReigsterServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>ReigsterServlet</servlet-name>
- <url-pattern>/RegisterServlet</url-pattern>
- </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"%>)
- <s:form action="register.action" theme="simple"><br>
- username:<s:textfield name="username" label="username"></s:textfield><br>
- password:<s:password name="password" label="password"></s:password><br>
- repassword:<s:password name="repassword" lable="repassword"></s:password><br>
- age:<s:textfield name="age" label="age"></s:textfield><br>
- birthday:<s:textfield name="birthday" label="birthday"></s:textfield><br>
- graduate:<s:textfield name="graduate" label="age"></s:textfield><br>
- <s:submit value="submit"></s:submit>
- </s:form>
3)接下来我们编写RegisterAction类
- public class RegisterAction extends ActionSupport {
- private String username;
- private String password;
- private String repassword;
- private int age;
- private Date birthday;
- private Date graduate;
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- public String getRepassword() {
- return repassword;
- }
- public void setRepassword(String repassword) {
- this.repassword = repassword;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public Date getBirthday() {
- return birthday;
- }
- public void setBirthday(Date birthday) {
- this.birthday = birthday;
- }
- public Date getGraduate() {
- return graduate;
- }
- public void setGraduate(Date graduate) {
- this.graduate = graduate;
- }
- @Override
- public String execute() throws Exception {
- // TODO Auto-generated method stub
- System.out.println("execute()");
- return SUCCESS;
- }
- @Override
- public void validate() {
- // TODO Auto-generated method stub
- System.out.println("validate()");
- if(null==username||username.length()<4||username.length()>6)
- {
- this.addFieldError("username","用户名无效");
- }
- if(null==password||password.length()<4||password.length()>6)
- {
- this.addFieldError("password","密码无效");
- }else if(null==repassword||repassword.length()!=password.length())
- {
- this.addFieldError("repassword","密码长度不一致");
- }else if(!repassword.equals(password))
- {
- this.addFieldError("repassword","密码不一致");
- }
- if(age<10||age>50)
- {
- this.addFieldError("age","年龄无效");
- }
- if(null==birthday)
- {
- this.addFieldError("birthday","出生日期为空");
- }
- if(null==graduate)
- {
- this.addFieldError("graduate","毕业日期为空");
- }
- if(null!=graduate&&null!=birthday)
- {
- Calendar c1=Calendar.getInstance();
- c1.setTime(birthday);
- Calendar c2=Calendar.getInstance();
- c2.setTime(graduate);
- if(!c1.before(c2))
- {
- this.addFieldError("graduate","毕业日期出生日期不匹配");
- }
- }
- }
- }
4)配置struts.xml文件
- <action name="register" class="cn.sict.register.RegisterAction">
- <result name="success">/result.jsp</result>//正确就跳转到result.jsp
- <result name="input">/register.jsp</result>//错误就跳转到register.jsp
- </action>
5)result.jsp与1中的相同,至此,就完成了所有的功能。
接下来,我们来看一下,使用struts框架,我们省略了哪些工作。
1)首先没有set/get方法了。
2)没有了servlet中从页面获得字符,然后再转换为需要的类型,然后简单的配置相应的result参数,就可以跳转到相应的页面。
3)继承了ActionSupport类重写validate()方法,使逻辑清晰。
Struts对上述的操作进行了包装,提高了程序的课重用性,我们只需要修改少量的参数和配置文件,就可以达到想要的效果。
从一个简单的小实例分析JSP+Servelt与JSP+Struts2框架的区别的更多相关文章
- Java Tread多线程(0)一个简单的多线程实例
作者 : 卿笃军 原文地址:http://blog.csdn.net/qingdujun/article/details/39341887 本文演示,一个简单的多线程实例,并简单分析一下线程. 编程多 ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(三)(错误整理篇)
使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二) 以上两篇已经把流 ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(二)(代码篇)
这篇是上一篇的延续: 用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一) 源代码在github上可以下载,地址:https://github.com/guoxia ...
- 使用ssm(spring+springMVC+mybatis)创建一个简单的查询实例(一)
梳理下使用spring+springMVC+mybatis 整合后的一个简单实例:输入用户的 ID,之后显示用户的信息(此次由于篇幅问题,会分几次进行说明,此次是工程的创建,逆向生成文件以及这个简单查 ...
- 输出多行字符的一个简单JAVA小程序
public class JAVA { public static void main(String[] args) { System.out.println("-------------- ...
- python -----一个简单的小程序(监控电脑内存,cpu,硬盘)
一个简单的小程序 用函数实现!~~ 实现: cpu 使用率大于百分之50 时 , C 盘容量不足5 G 时, 内存 低于2G 时. 出现以上其中一种情况,发送自动报警邮件! 主要运用 到了两个 模 ...
- 使用JAVA实现的一个简单IOC注入实例
https://blog.csdn.net/echoshinian100/article/details/77977823 欲登高而望远,勿筑台于流沙 RSS订阅 原 使用JAVA实现的一个简单IOC ...
- Qt5.9一个简单的多线程实例(类QThread)(第一种方法)
Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...
- 3.2 Lucene实战:一个简单的小程序
在讲解Lucene索引和检索的原理之前,我们先来实战Lucene:一个简单的小程序! 一.索引小程序 首先,new一个java project,名字叫做LuceneIndex. 然后,在project ...
随机推荐
- 到底EJB是什么
到底EJB是什么 到底EJB是什么?被口口相传的神神秘秘的,百度一番,总觉得没有讲清楚的,仍觉得一头雾水.百度了很久,也从网络的文章的只言片语中,渐渐有了头绪. 用通俗话说,EJB就是:" ...
- Linux嵌入式 -- 内核 - 内存管理
1. 逻辑地址 线性地址 物理地址 段式管理: 16位CPU,20根地址总线,可寻址1M内存,但是只有16位的寄存器,64K. 逻辑地址 = 段基地址 + 段内偏移地址 物理地址 PA = 段 ...
- eclipse安装hibernate插件(在线Marketplace中安装)
网上很多都是给个网址,然后在eclipse的help中new install soft中安装.每次安装还要去查找最新的地址去安装.为什么不用eclipse的marketplace直接搜索安装呢? 打开 ...
- BZOJ 2425 [HAOI2010]计数:数位dp + 组合数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2425 题意: 给你一个数字n,长度不超过50. 你可以将这个数字: (1)去掉若干个0 ( ...
- java: scanner(输入流)文本扫描类
//scanner是接受system.in输入流的操作类 //scanner同时也支持文件输入流的操作 //一个可以使用正则表达式来分析基本类型和字符串的简单文本扫描器 Scanner scan = ...
- 【疯了C#】神奇的换肤(二)
昨天参照了网上的资料练习了换肤,今天进一步的实现选择换肤 其实很简单,需要实现的功能如下点击combobox中的不同项目然后面板会自动的切换到相应的界面主题. 界面如下: 下述代码参照 “张隽永” 博 ...
- jekyll+github搭建个人博客总结
jekyll+github搭建个人博客 经过一天多的折腾,终于算是搭建好了自己的个人博客,看到有些社区评论说:在windows下用jekyll搭建静态博客,简直就自讨苦吃,但是都到一半了,有什么办法呢 ...
- MySQL 索引知识整理(创建高性能的索引)
前言: 索引优化应该是对查询性能优化的最有效的手段了.索引能够轻易将查询性能提高几个数量级. // 固态硬盘驱动器有和机械硬盘启动器,有着完全不同的性能特性: 然而即使是固态硬盘,索引的原则依然成立, ...
- 奔跑吧,OpenStack现场分享:超融合架构如何抹平物理硬件差异?
转自:https://www.ustack.com/blog/moping/ “通过引入OpenStack这一中间层,实现了云平台统一的管理调度支配向上交付,解决了业务的灵活性问题.但是在抹平下层物理 ...
- DB21019E An error occurred while accessing the directory "/root".
如果是在Linux上刚装完DB2即刻建立database,可能会遇到错误DB21019E An error occurred while accessing the directory "/ ...