首先我们来理清一些观点吧:

DAO(Data Access Object):紧张对数据的操作,增加、修正、删除等原子性操作。
Web层:界面+掌握器,也便是说JSP【界面】+Servlet【掌握器】Service业务层:将多个原子性的DAO操作进行组合,组合成一个完全的业务逻辑掌握层:紧张利用Servlet进行掌握数据访问层:利用DAO、Hibernate、JDBC技能实现对数据的增编削查JavaBean用于封装数据,处理部分核心逻辑,每一层中都用到!
模式一

模式一指的便是在开拓中将显示层、掌握层、数据层的操作统一交给JSP或者JavaBean来进行处理!

模式一有两种情形:

用jsp写一个计算器JavaWeb基本Web开辟模式修订版 NoSQL

完备利用JSP做开拓优点:开拓速率贼快,只要写JSP就行了,JavaBean和Servlet都不用设计!
小幅度修正代码方便,直接修正JSP页面交给WEB容器就行了,不像Servlet还要编译成.class文件再交给做事器!
【当然了,在ide下开拓这个也不算是事】缺陷:程序的可读性差、复用性低、代码繁芜!
什么jsp代码、html代码都往上面写,这肯定很难阅读,很难重用!
利用JSP+JavaBean做开拓优点:程序的可读性较高,大部分的代码都写在JavaBean上,不会和HTML代码稠浊在一起,可读性还行的。
可重复利用高,核心的代码都由JavaBean开拓了,JavaBean的设计便是用来重用、封装,大大减少编写重复代码的事情!
缺陷:没有流程掌握,程序中的JSP页面都须要检讨要求的参数是否精确,非常发生时的处理。
显示操作和业务逻辑代码事情会紧密耦合在一起的!
日后掩护会困难

运用例子:

我们利用JavaBean+JSP开拓一个大略单纯的打算器吧,效果如图下:

首先开拓JavaBean工具

public class Calculator { private double firstNum; private double secondNum; private char Operator = '+'; private double result; //JavaBean供应了打算的功能 public void calculate() { switch (this.Operator) { case '+': this.result = this.firstNum + this.secondNum; break; case '-': this.result = this.firstNum - this.secondNum; break; case '': this.result = this.firstNum this.secondNum; break; case '/': if (this.secondNum == 0) { throw new RuntimeException(\公众除数不能为0\"大众); } this.result = this.firstNum / this.secondNum; break; default: throw new RuntimeException(\公众传入的字符造孽!
\"大众); } } public double getFirstNum() { return firstNum; } public void setFirstNum(double firstNum) { this.firstNum = firstNum; } public double getSecondNum() { return secondNum; } public void setSecondNum(double secondNum) { this.secondNum = secondNum; } public char getOperator() { return Operator; } public void setOperator(char operator) { Operator = operator; } public double getResult() { return result; } public void setResult(double result) { this.result = result; }}再开拓显示页面

<%--开拓用户界面--%> <form action=\"大众/zhongfucheng/1.jsp\公众 method=\公众post\"大众> <table border=\公众1\"大众> <tr> <td colspan=\公众2\"大众>大略计数器</td> <td></td> </tr> <tr> <td>第一个参数:</td> <td><input type=\"大众text\"大众 name=\"大众firstNum\公众></td> </tr> <tr> <td>运算符</td> <td> <select name=\公众operator\"大众> <option value=\"大众+\公众>+</option> <option value=\"大众-\"大众>-</option> <option value=\"大众\公众></option> <option value=\"大众/\公众>/</option> </select> </td> </tr> <tr> <td>第二个参数:</td> <td><input type=\"大众text \"大众 name=\公众secondNum\"大众></td> </tr> <tr> <td colspan=\公众2\"大众><input type=\"大众submit\"大众 value=\公众提交\"大众></td> <td></td> </tr> </table> </form>效果:

获取得到显示页面提交的参数,调用JavaBean的方法,末了输出结果!

<%--获取得到Bean工具--%> <jsp:useBean id=\"大众calculator\"大众 class=\"大众domain.Calculator\公众 scope=\"大众page\"大众/> <%--设置Bean工具的数据--%> <jsp:setProperty name=\公众calculator\公众 property=\公众\公众/> <%--调用Caculator的方法打算出值--%> <jsp:scriptlet> calculator.calculate(); </jsp:scriptlet> <%--得出的结果:--%> <c:out value=\公众打算得出的结果是:\"大众/> <jsp:getProperty name=\"大众calculator\"大众 property=\"大众firstNum\公众/> <jsp:getProperty name=\公众calculator\公众 property=\"大众operator\公众/> <jsp:getProperty name=\"大众calculator\"大众 property=\"大众secondNum\公众/> <c:out value=\公众=\"大众/> <jsp:getProperty name=\公众calculator\"大众 property=\"大众result\"大众/>效果:

开拓这个大略单纯的打算器,只用了一个JSP页面和一个JavaBean完成!

总的来说,Mode I 适宜小型的开拓,繁芜程序低的开拓,由于Mode I 的特点便是开拓速率快,但在进行掩护的时候就要付出更大的代价!

模式二

Mode II 中所有的开拓都因此Servlet为主体展开的,由Servlet吸收所有的客户端要求,然后根据要求调用相对应的JavaBean,并所有的显示结果交给JSP完成!
,也便是俗称的MVC设计模式!

MVC设计模式:

显示层(View):紧张卖力接管Servlet通报的内容,调用JavaBean,将内容显示给用户掌握层(Controller):紧张卖力所有用户的要求参数,判断要求参数是否合法,根据要求的类型调用JavaBean,将终极的处理结果交给显示层显示!
模型层(Mode):模型层包括了业务层,DAO层。

运用例子:

我们利用MVC模式开拓一个大略的用户上岸注册的案例吧!
作为一个大略的用户上岸注册,这里就直策应用XML文档当作小型数据库吧!

①搭建开拓环境

导入相对应的开拓包创建程序的包名创建xml文件,当做小型的数据库

②开拓实体User

private int id;private String username;private String password;private String email;private Date birthday;//....各种setter、getter

③开拓dao

这个根据业务来开拓,我们是上岸注册,那该当供应什么功能呢?注册(外界通报一个User工具进来,我可以在XML文档多一条信息)。
上岸(外界通报用户名和密码过来,我就在XML文档中查找有没该用户名和密码,如果有就返回一个User工具)3.1上岸功能:

//外界通报用户名和密码进来,我要在XML文档中查找是否有该条记录public User find(String username, String password) { //得到XML文档的流工具 InputStream inputStream = UserImplXML.class.getClassLoader().getResourceAsStream(\"大众user.xml\公众); //得到dom4j的解析器工具 SAXReader saxReader = new SAXReader(); try { //解析XML文档 Document document = saxReader.read(path); //利用XPATH技能,查找XML文档中是否有通报进来的username和password Element element = (Element) document.selectSingleNode(\"大众//user[@username='\"大众 + username + \公众' and@password='\"大众 + password + \公众']\"大众); if (element == null) { return null; } //如果有,就把XML查出来的节点信息封装到User工具,返回出去 User user = new User(); user.setId(Integer.parseInt(element.attributeValue(\公众id\公众))); user.setUsername(element.attributeValue(\"大众username\"大众)); user.setPassword(element.attributeValue(\"大众password\公众)); user.setEmail(element.attributeValue(\"大众email\"大众)); //生日就须要转换一下了,XML文档保存的是字符串,User工具须要的是Date类型 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\"大众yy-MM-dd\"大众); Date birthday = simpleDateFormat.parse(element.attributeValue(\"大众birthday\"大众)); user.setBirthday(birthday); //返回User工具出去 return user; } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(\公众初始化时候出错啦!
\"大众); } catch (ParseException e) { e.printStackTrace(); throw new RuntimeException(\公众查询的时候出错啦!
\"大众); }}做完一个功能,最好就测试一下,看有没有缺点再连续往下写!

private String username = \公众zhongfucheng\"大众;private String password = \"大众123\"大众;@Testpublic void testLogin() { UserImplXML userImplXML = new UserImplXML(); User user = userImplXML.find(username, password); System.out.println(user.getBirthday()); System.out.println(user.getEmail()); System.out.println(user.getId()); System.out.println(user.getUsername()); System.out.println(user.getPassword());}效果:

3.2注册功能

//注册功能,外界通报一个User工具进来。
我就在XML文档中添加一条信息public void register(User user) { //获取XML文档路径!
String path = UserImplXML.class.getClassLoader().getResource(\"大众user.xml\"大众).getPath(); try { //获取dom4j的解析器,解析XML文档 SAXReader saxReader = new SAXReader(); Document document = saxReader.read(path); //在XML文档中创建新的节点 Element newElement = DocumentHelper.createElement(\"大众user\"大众); newElement.addAttribute(\"大众id\"大众, String.valueOf(user.getId())); newElement.addAttribute(\公众username\"大众, user.getUsername()); newElement.addAttribute(\"大众email\"大众, user.getEmail()); newElement.addAttribute(\"大众password\"大众, user.getPassword()); //日期返回的是指定格式的日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\公众yy-MM-dd\"大众); String date = simpleDateFormat.format(user.getBirthday()); newElement.addAttribute(\"大众birthday\"大众,date); //把新创建的节点增加到父节点上 document.getRootElement().add(newElement); //把XML内容中文档的内容写到硬盘文件上 OutputFormat outputFormat = OutputFormat.createPrettyPrint(); outputFormat.setEncoding(\"大众UTF-8\"大众); XMLWriter xmlWriter = new XMLWriter(new FileWriter(path),outputFormat); xmlWriter.write(document); xmlWriter.close(); } catch (DocumentException e) { e.printStackTrace(); throw new RuntimeException(\"大众注册的时候出错了!


\"大众); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(\"大众注册的时候出错了!


\公众); }}我们也测试一下有没有缺点!

@Testpublic void testRegister() { UserImplXML userImplXML = new UserImplXML(); //这里我为了测试的方便,就添加一个带5个参数的布局函数了!
User user = new User(10, \公众nihao\公众, \公众123\公众, \公众sina@qq.com\"大众, new Date()); userImplXML.register(user);}把稳!
测试的结果是在classes目录下的user.xml文件查询的!
由于我们是用Test来测试代码,读取XML文件时利用的是类装载器的方法,在编译后,按照WEB的构造目录,XML文件的读写是在WEB-INF的classes目录下的!

DAO的实现已经开拓完成了,接下来我们就对DAO的实现进行抽取。
【当然了,也可以先写DAO再写DAO的实现】

④开拓service层

service层的开拓就非常大略了!
上面已经说了,service层便是:将多个原子性的DAO操作进行组合,组合成一个完全的业务逻辑。
大略来说:对web层供应所有的业务做事的!

在逻辑代码不是非常繁芜的情形下,我们可以没有service层的,这里还是演示一下吧!

public class UserServiceXML { //Service层便是调用Dao层的方法,我们就直接在类中创建Dao层的工具了 UserDao userImplXML = new UserImplXML(); public void register(User user) { userImplXML.register(user); } public void login(String username, String password) { userImplXML.find(username, password); }}当然了,为了更好的解耦,也把它抽取成接口!

⑤开拓web层

5.1我们来先做注册的界面吧!

供应注册界面的Servlet

public class RegisterUIServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { //直接跳转到显示注册界面的JSP request.getRequestDispatcher(\"大众/WEB-INF/register.jsp\公众).forward(request, response); } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws javax.servlet.ServletException, IOException { this.doPost(request, response); }}开拓注册界面的JSP

<h1>欢迎来到注册界面!
</h1><%--提交给处理注册的处理Servlet--%><form method=\公众post\公众 action=\"大众${pageContext.request.contextPath}/RegisterServlet\"大众> <table> <%--对付id来讲,是做事器分配的!
不须要用户自己输入--%> <tr> <td>用户名</td> <td> <input type=\公众text \"大众 name=\公众username\"大众> </td> </tr> <tr> <td>密码</td> <td> <input type=\"大众text\"大众 name=\"大众password\"大众> </td> </tr> <tr> <td>确认密码</td> <td> <input type=\"大众text\"大众 name=\"大众password\"大众> </td> </tr> <tr> <td>邮箱</td> <td> <input type=\"大众text\"大众 name=\"大众email\"大众> </td> </tr> <tr> <td>生日</td> <td> <input type=\公众text \"大众 name=\"大众birethday\"大众> </td> </tr> <tr> <td> <input type=\"大众submit\"大众 value=\公众提交\公众> </td> <td> <input type=\"大众reset\"大众 value=\"大众重置!
\"大众> </td> </tr> </table></form>JSP页面是这样子的

接下来,我们要开拓处理用户注册提交的Servlet

//首先要接管Parameter的参数,封装到User里面去String username = request.getParameter(\"大众username\"大众);String password = request.getParameter(\"大众password\"大众);//......如果参数过多,我们就要写好多好多类似的代码了...此时,我们该当想起反射机制中的BeanUtils开拓包..为了更好地重用,我就将它写成一个工具类!

/ 将Parameter参数的数据封装到Bean中,为了外边不用强转,这里就利用泛型了!
@request 由于要获取的是Parameter参数的信息,以是须要有request工具 @tClass 本身是不知道封装什么工具的,以是用class /public static <T> T request2Bean(HttpServletRequest httpServletRequest, Class<T> tClass) { try { //创建tClass的工具 T bean = tClass.newInstance(); //获取得到Parameter中全部的参数的名字 Enumeration enumeration = httpServletRequest.getParameterNames(); //遍历上边获取得到的凑集 while (enumeration.hasMoreElements()) { //获取得到每一个带过来参数的名字 String name = (String) enumeration.nextElement(); //获取得到值 String value = httpServletRequest.getParameter(name); //把数据封装到Bean工具中 BeanUtils.setProperty(bean, name, value); } return bean; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(\"大众封装数据到Bean工具中出错了!
\公众); }}经由我们测试,日期不能直接封装到Bean工具中,会直接报出非常!

对付日期而言,须要一个日期转换器。
当BeanUtils的setProperty()方法检测到日期时,会自动调用日期转换器对日期进行转换,从而实现封装!
于是乎,就在上面的方法中添加以下一句代码

//日期转换器ConvertUtils.register(new DateLocaleConverter(), Date.class);还有一个问题,用户的id不是自己输入的,是由程序天生的。
我们避免id的重复,就利用UUID天生用户的id吧!
为了更好的重用,我们也把它封装成一个方法!

/天生ID/public static int makeId() { return Integer.parseInt(UUID.randomUUID().toString());}好的,我们来测试一下吧!
以下是RegisterServlet的代码

User user = WebUtils.request2Bean(request, User.class);user.setId(WebUtils.makeId());//调用service层的注册方法,实现注册ServiceBussiness serviceBussiness = new UserServiceXML();serviceBussiness.register(user);效果:

上面的代码是不足完善的(没有校验用户输入的信息、注册成功或失落败都没有给出提示..等等)

下面,我们来校验用户输入的信息吧,如果用户输入的信息不合法,就直接跳转回注册的界面。
刚才我们是用BeanUtils把Parameter的信息全部直接封装到User工具中,但现在我想要验证用户提交表单的数据,也该当把表单的数据用一个工具保存着【面向工具的思想、封装、重用】流程是这样子的:当用户提交表单数据的时候,就把表单数据封装到我们设计的表单工具上,调用表单工具的方法,验证数据是否合法!
好了,我们来开拓一个表单的工具吧,最主要的是怎么填写validate()方法!

public class FormBean { //表单提交过来的数据全都是String类型的,birthday也不例外!
private String username; private String password; private String password2; private String email; private String birthday; /用于判断表单提交过来的数据是否合法/ public boolean validate() { return false; } //......各种setter、getter方法}以下是我定下的规则:

方法的代码如下:

public boolean validate() { //用户名不能为空,并且假如3-8的字符 abcdABcd if (this.username == null || this.username.trim().equals(\公众\"大众)) { return false; } else { if (!this.username.matches(\公众[a-zA-Z]{3,8}\公众)) { return false; } } //密码不能为空,并且假如3-8的数字 if (this.password == null || this.password.trim().equals(\"大众\"大众)) { return false; } else { if (!this.password.matches(\公众\\d{3,8}\公众)) { return false; } } //两次密码要同等 if (this.password2 != null && !this.password2.trim().equals(\"大众\"大众)) { if (!this.password2.equals(this.password)) { return false; } } //邮箱可以为空,如果为空就必须合法 if (this.email != null && !this.email.trim().equals(\"大众\公众)) { if (!this.email.matches(\"大众\\w+@\\w+(\\.\\w+)+\"大众)) { System.out.println(\"大众邮箱缺点了!
\"大众); return false; } } //日期可以为空,如果为空就必须合法 if (this.birthday != null && !this.birthday.trim().equals(\"大众\"大众)) { try { DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(); dateLocaleConverter.convert(this.birthday); } catch (Exception e) { System.out.println(\公众日期缺点了!
\"大众); return false; } } //如果上面都没有实行,那么便是合法的了,返回true return true;}处理表单数据的Servlet,代码是这样子的:

//将表单的数据封装到formBean中FormBean formBean = WebUtils.request2Bean(request, FormBean.class);//验证表单的数据是否合法,如果不合法就跳转回去注册的页面if(formBean.validate()==false){ request.getRequestDispatcher(\公众/WEB-INF/register.jsp\公众).forward(request, response); return;}try { //将表单的数据封装到User工具中 User user = WebUtils.request2Bean(request, User.class); user.setId(WebUtils.makeId()); //调用service层的注册方法,实现注册 ServiceBussiness serviceBussiness = new UserServiceXML(); serviceBussiness.register(user);} catch (Exception e) { e.printStackTrace();}接下来我们测试一下吧!
将所有的信息都按照规定的输入!

没有问题!
已经将记录写到XML文件上了!

但是,如果我没有输入日期呢?

它抛出了缺点!
缘故原由也非常大略:表单数据提交给Servlet,Servlet将表单的数据(Parameter中的数据)用BeanUtils封装到User工具中,当封装到日期的时候,创造日期为null,无法转换成日期工具!

那我们现在要怎么办理呢?

首先我们要明确:由于我们在设定的时候,已经许可了email和birthday可以为空,那么在DAO层就该当有相应的逻辑判断email和birthday是否为空!

if (user.getEmail() == null) { newElement.addAttribute(\"大众email\公众, \"大众\"大众);} else { newElement.addAttribute(\"大众email\公众, user.getEmail());}//如果不是空才格式化信息if (user.getBirthday() != null) { //日期返回的是指定格式的日期 SimpleDateFormat simpleDateFormat = new SimpleDateFormat(\公众yyyy-MM-dd\公众); String date = simpleDateFormat.format(user.getBirthday()); newElement.addAttribute(\公众birthday\"大众, date);} else { newElement.addAttribute(\"大众birthday\"大众, \公众\"大众);}

办理办法:

Parameter中的数据如果是\"大众\公众,我就不把数据封装到User工具中,实行下一次循环!

public static <T> T request2Bean(HttpServletRequest httpServletRequest, Class<T> tClass) { try { //创建tClass的工具 T bean = tClass.newInstance(); //获取得到Parameter中全部的参数的名字 Enumeration enumeration = httpServletRequest.getParameterNames(); //日期转换器 ConvertUtils.register(new DateLocaleConverter(), Date.class); //遍历上边获取得到的凑集 while (enumeration.hasMoreElements()) { //获取得到每一个带过来参数的名字 String name = (String) enumeration.nextElement(); //获取得到值 String value = httpServletRequest.getParameter(name); //如果Parameter中的数据为\"大众\"大众,那么我就不封装到User工具里边去!
实行下一次循环 if (value == \"大众\"大众) { continue; } else { //把数据封装到Bean工具中 BeanUtils.setProperty(bean, name, value); } } return bean; } catch (Exception e) { e.printStackTrace(); throw new RuntimeException(\公众封装数据到Bean工具中出错了!
\"大众); }}效果:

将数据封装到User工具中还有其余一个办法:

我们知道BeanUtils有个copyProperties()方法,可以将某个工具的成员数据拷贝到其余一个工具的成员变量数据上(条件是成员变量的名称相同!
)我们FormBean工具的成员变量名称和User工具的成员变量的名称是同等的!
并且,前面在验证的时候,我们已经把Parameter中带过来的数据封装到了FormBean工具中了,以是我们可以利用copyProperties()方法!
利用该方法时,值得把稳的是:第一个参数是拷贝到哪一个工具上(也便是User工具),第二个参数是被拷贝的工具(也便是formbean工具),口诀:后拷前….不要搞混了!




(我便是搞混了,弄了良久…)

处理表单的Servlet完全代码如下:

//将表单的数据封装到formBean中FormBean formBean = WebUtils.request2Bean(request, FormBean.class);//验证表单的数据是否合法,如果不合法就跳转回去注册的页面if(formBean.validate()==false){ request.getRequestDispatcher(\公众/WEB-INF/register.jsp\"大众).forward(request, response); return;}try { //这是第一种-------------------------- /User user = new User(); user.setId(WebUtils.makeId()); BeanUtils.copyProperties(user,formBean);/ //------------------------------------------ //这是第二种 User user1 = WebUtils.request2Bean(request,User.class); user1.setId(WebUtils.makeId()); //----------------------------------- //调用service层的注册方法,实现注册 ServiceBussiness serviceBussiness = new UserServiceXML(); serviceBussiness.register(user1);} catch (Exception e) { e.printStackTrace();}

现在还有问题,如果我填写信息不合法,提交给做事器验证往后,做事器该当见告用户哪个信息不合法,而不是直接把跳转回注册界面,把所有的信息全部清空,让用户重新填写!

我们该当这样做:当创造用户输入的信息不合法时,把缺点的信息记录下来,等到返回注书页面,就提示用户哪里出错了!

在FormBean工具中添加一个HashMap凑集(由于等会还要根据关键字把缺点信息显示给用户!
)FormBean的全部代码如下:

//表单提交过来的数据全都是String类型的,birthday也不例外!
private String username;private String password;private String password2;private String email;private String birthday;//记录缺点的信息private HashMap<String, String> error = new HashMap<>();/用于判断表单提交过来的数据是否合法/public boolean validate() { //用户名不能为空,并且假如3-8的字符 abcdABcd if (this.username == null || this.username.trim().equals(\"大众\公众)) { error.put(\公众username\公众, \"大众用户名不能为空,并且假如3-8的字符\"大众); return false; } else { if (!this.username.matches(\公众[a-zA-Z]{3,8}\"大众)) { error.put(\"大众username\公众, \公众用户名不能为空,并且假如3-8的字符\"大众); return false; } } //密码不能为空,并且假如3-8的数字 if (this.password == null || this.password.trim().equals(\"大众\"大众)) { error.put(\公众password\公众, \"大众密码不能为空,并且假如3-8的数字\"大众); return false; } else { if (!this.password.matches(\"大众\\d{3,8}\"大众)) { error.put(\"大众password\公众, \"大众密码不能为空,并且假如3-8的数字\"大众); return false; } } //两次密码要同等 if (this.password2 != null && !this.password2.trim().equals(\"大众\"大众)) { if (!this.password2.equals(this.password)) { error.put(\"大众password2\"大众, \"大众两次密码要同等\"大众); return false; } } //邮箱可以为空,如果为空就必须合法 if (this.email != null && !this.email.trim().equals(\"大众\"大众)) { if (!this.email.matches(\"大众\\w+@\\w+(\\.\\w+)+\公众)) { error.put(\"大众email\"大众, \公众邮箱不合法!
\"大众); return false; } } //日期可以为空,如果为空就必须合法 if (this.birthday != null && !this.birthday.trim().equals(\"大众\公众)) { try { DateLocaleConverter dateLocaleConverter = new DateLocaleConverter(); dateLocaleConverter.convert(this.birthday); } catch (Exception e) { error.put(\公众birthday\公众, \"大众日期不合法!
\公众); return false; } } //如果上面都没有实行,那么便是合法的了,返回true return true;}//.....各种的setter和getter在跳转到注书页面之前,把formbean工具存到request域中。
在注书页面就可以把缺点的信息取出来(利用EL表达式)!
处理表单的Servlet的部分代码

//验证表单的数据是否合法,如果不合法就跳转回去注册的页面if(formBean.validate()==false){ //在跳转之前,把formbean工具通报给注书页面 request.setAttribute(\"大众formbean\"大众, formBean); request.getRequestDispatcher(\"大众/WEB-INF/register.jsp\"大众).forward(request, response); return;}在注书页面中,利用EL表达式把缺点的信息写出来

测试:

效果:

做到这里,还是有丢丢的问题,我们不应该把用户输入的数据全部清空的!
你想想,如果用户注册须要输入多个信息,仅仅一个出错了,就把全部信息清空,要他重新填写,这样是不合理的!

我们在各个的输入项中利用EL表达式回显数据就行了!

效果:

还没有完善,细心的朋友可以创造,上面图的日期也是缺点的,但是没一次性标记出来给用户!
要改也十分大略:在验证的时候,不要先急着return false 用一个布尔型变量记住,末了返回布尔型的变量即可

无论注册成功还是失落败都须要给用户一个友好界面的!

5.2上岸界面

上岸和注册是类似的,我们按着注册的步骤来写就对了!

首先写一个供应上岸界面的Servlet

//直接跳转到上岸界面 request.getRequestDispatcher(\公众/WEB-INF/login.jsp\公众).forward(request, response);写上岸界面

<h1>这是上岸界面</h1><form action=\"大众${pageContext.request.contextPath}/LoginServlet\"大众 method=\公众post\"大众> <table> <tr> <td>用户名</td> <td><input type=\公众text\"大众 name=\"大众username\公众></td> </tr> <tr> <td>密码</td> <td><input type=\"大众password\"大众 name=\"大众password\公众></td> </tr> <tr> <td><input type=\"大众submit\"大众 value=\"大众提交\公众></td> <td><input type=\公众reset\"大众 name=\"大众重置\公众></td> </tr> </table></form>写处理上岸表单的Servlet

//获取提交过来的数据String username = request.getParameter(\公众username\"大众);String password = request.getParameter(\公众password\"大众);//调用service层的方法,去查询数据库(XML)是否有该条记录try { ServiceBussiness serviceBussiness = new UserServiceXML(); User user = serviceBussiness.login(username, password); if (user == null) { request.setAttribute(\公众message\公众, \"大众用户名或密码是错的\公众); } else { request.setAttribute(\公众message\公众,\"大众上岸成功\"大众); }} catch (Exception e) { e.printStackTrace(); request.setAttribute(\公众message\"大众,\"大众上岸失落败咯\公众);}request.getRequestDispatcher(\"大众/message.jsp\"大众).forward(request, response);效果:

5.3把注册和上岸都挂在首页上

<h1>这是首页!
</h1><a href=\"大众${pageContext.request.contextPath}/LoginUIServlet\"大众>上岸</a><a href=\"大众${pageContext.request.contextPath}/RegisterUIServlet\公众>注册</a></body>

总结利用JSP+JavaBean开拓一个大略打算器,是非常随意马虎的,显示页面和要求都是交由JSP来做。
没有什么新的知识点,用一些JSP行为就能完成了。
MVC模式开拓利用Servlet来做处理要求,代码量略大,但层次清晰利用BeanUtils开拓组件可以将request要求的参数封装到JavaBean工具中,Date属性要其余处理校验的功能也是利用一个JavaBean来完成,目的便是为了可重用性,职责分工。
同时,我们可以在该JavaBean设置一个Map凑集来保存缺点的信息,以便在前台上展示缺点信息。
原文地址:https://dwz.cn/Va6odzfm作者:Java3y