当前位置: 首页 > news >正文

快速一体化网站建设工程分包信息平台

快速一体化网站建设,工程分包信息平台,大型网站建设 教程,不良网站进入窗口软件下载7开发模式的介绍在Web开发模式中#xff0c;有两个主要的开发结构#xff0c;称为模式一(Mode I)和模式二(Mode II).首先我们来理清一些概念吧#xff1a;DAO(Data Access Object)#xff1a;主要对数据的操作#xff0c;增加、修改、删除等原子性操作。Web层#xff1a;界…开发模式的介绍在Web开发模式中有两个主要的开发结构称为模式一(Mode I)和模式二(Mode II).首先我们来理清一些概念吧DAO(Data Access Object)主要对数据的操作增加、修改、删除等原子性操作。Web层界面控制器也就是说JSP【界面】Servlet【控制器】Service业务层将多个原子性的DAO操作进行组合组合成一个完整的业务逻辑控制层主要使用Servlet进行控制数据访问层使用DAO、Hibernate、JDBC技术实现对数据的增删改查JavaBean用于封装数据处理部分核心逻辑每一层中都用到模式一模式一指的就是在开发中将显示层、控制层、数据层的操作统一交给JSP或者JavaBean来进行处理模式一有两种情况完全使用JSP做开发优点缺点程序的可读性差、复用性低、代码复杂什么jsp代码、html代码都往上面写这肯定很难阅读很难重用开发速度贼快只要写JSP就行了JavaBean和Servlet都不用设计小幅度修改代码方便直接修改JSP页面交给WEB容器就行了不像Servlet还要编译成.class文件再交给服务器【当然了在ide下开发这个也不算是事】使用JSPJavaBean做开发优点缺点没有流程控制程序中的JSP页面都需要检查请求的参数是否正确异常发生时的处理。显示操作和业务逻辑代码工作会紧密耦合在一起的日后维护会困难程序的可读性较高大部分的代码都写在JavaBean上不会和HTML代码混合在一起可读性还行的。可重复利用高核心的代码都由JavaBean开发了JavaBean的设计就是用来重用、封装大大减少编写重复代码的工作应用例子我们使用JavaBeanJSP开发一个简易的计算器吧效果如图下首先开发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;}}再开发显示页面%--开发用户界面--%简单计数器第一个参数运算符-*/第二个参数效果获取得到显示页面提交的参数调用JavaBean的方法最后输出结果calculator.calculate();效果开发这个简易的计算器只用了一个JSP页面和一个JavaBean完成总的来说Mode I 适合小型的开发复杂程序低的开发因为Mode I 的特点就是开发速度快但在进行维护的时候就要付出更大的代价模式二Mode II 中所有的开发都是以Servlet为主体展开的由Servlet接收所有的客户端请求然后根据请求调用相对应的JavaBean并所有的显示结果交给JSP完成也就是俗称的MVC设计模式MVC设计模式显示层(View)主要负责接受Servlet传递的内容调用JavaBean将内容显示给用户控制层(Controller)主要负责所有用户的请求参数判断请求参数是否合法根据请求的类型调用JavaBean将最终的处理结果交给显示层显示模型层(Mode)模型层包括了业务层DAO层。应用例子我们使用MVC模式开发一个简单的用户登陆注册的案例吧作为一个简单的用户登陆注册这里就直接使用XML文档当作小型数据库吧①搭建开发环境导入相对应的开发包创建程序的包名创建xml文件当做小型的数据库②开发实体Userprivate 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和passwordElement element (Element) document.selectSingleNode(//user[username username andpassword 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, sinaqq.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我们来先做注册的界面吧提供注册界面的Servletpublic 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 {//直接跳转到显示注册界面的JSPrequest.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欢迎来到注册界面用户名密码确认密码邮箱生日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 request2Bean(HttpServletRequest httpServletRequest, Class 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的字符 abcdABcdif (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;}}//如果上面都没有执行那么就是合法的了返回truereturn 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文件上了但是如果我没有输入日期呢它抛出了错误原因也非常简单表单数据提交给ServletServlet将表单的数据(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 request2Bean(HttpServletRequest httpServletRequest, Class 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 error new HashMap();/*用于判断表单提交过来的数据是否合法*/public boolean validate() {//用户名不能为空并且要是3-8的字符 abcdABcdif (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;}}//如果上面都没有执行那么就是合法的了返回truereturn 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);写登陆界面这是登陆界面用户名密码写处理登陆表单的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把注册和登陆都挂在首页上这是首页登陆注册总结使用JSPJavaBean开发一个简单计算器是非常容易的显示页面和请求都是交由JSP来做。没有什么新的知识点用一些JSP行为就能完成了。MVC模式开发使用Servlet来做处理请求代码量略大但层次清晰使用BeanUtils开发组件可以将request请求的参数封装到JavaBean对象中Date属性要另外处理校验的功能也是使用一个JavaBean来完成目的就是为了可重用性职责分工。同时我们可以在该JavaBean设置一个Map集合来保存错误的信息以便在前台上展示错误信息。如果文章有错的地方欢迎指正大家互相交流。习惯在微信看技术文章的同学可以关注微信公众号:Java3y
http://www.pierceye.com/news/844708/

相关文章:

  • 扬中网站推广导流非国产手机浏览器
  • 外国网站英语要求建立网站就是制作网页
  • 电商网站建设与运营实训可以做网站的app
  • 深圳南山区网站建设公司站长工具seo综合查询 分析
  • 互粉的网站是怎么做的网站建设公司利润怎么样
  • 个人网站平台搭建咸阳企业做网站
  • 租用外国服务器网站网站建设电子商务论文选题方向
  • 网站建设那种语言好wordpress 首页添加链接
  • NET开发网站开发工程师招聘潍坊市网站建设公司
  • 自己开发网站怎么盈利开发游戏需要多少资金
  • 先域名 还是先做网站塘厦
  • 企业公众号以及网站建设wordpress 代码块样式
  • 网站源码搭建教程大同建设银行保安招聘网站
  • 无锡网站设wordpress营销模板
  • 建站哪个好一点wordpress直达按钮
  • 卢松松网站的百度广告怎么做的小程序开发成都公司
  • 导航网站头部代码android开发者官网
  • 网站设计需求分析报告做漫画的网站有哪些
  • 做什么网站吸引人sinaapp wordpress 固定链接
  • 东莞做网站怎么样搜狐综合小时报2022113011
  • 校园网站的意义融资渠道
  • 做网站上海公司自己制作一个网站需要什么软件
  • 铜川做网站电话app开发程序
  • 自助建微网站备案后修改网站名称
  • 免费网站正能量网站如何后台管理
  • 网站开发的质量标准网站如何做自适应
  • 黄南州wap网站建设公司wordpress里面怎么加链接
  • 五分钟自己创建网站的方法免费试用网站空间
  • 安徽平台网站建设找哪家辽宁建设工程信息网审核
  • 余姚住房和建设局网站10元备案域名购买