Web---创建Servlet的3种方式、简单的用户注册功能(2)

简介: Web---创建Servlet的3种方式、简单的用户注册功能

简单的用户注册功能:


首先,我们需要一个xml,用来存储用户的注册信息;

我们在项目的src文件夹下建立了一个user.xml文件。 image.png

user.xml:

我们只写了xml的头,和需要的一个根元素


<?xml version="1.0" encoding="UTF-8"?>
<users>
</users>


写一个公共类工厂:Dom4jFactory

大家共用访问同一个document~。

(单例)


Dom4jFactory.java

package cn.hncu.factory;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import org.dom4j.Document;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class Dom4jFactory {
    private static Document dom = null;
    private static String path;
    //静态块!只会运行一次!特点是在类加载的时候就执行
    static{
        try{
            SAXReader sax = new SAXReader();
            // 学习一下服务器下的资源路径加载方式(因为我们的资源已经从MyEclipse中发布到Tomcat服务器中了,所以跟原来纯Java项目不一样了)
            // 利用当前类找到它的类加载器,然后通过该类加载器再去获得资源路径
            path = Dom4jFactory.class.getClassLoader().getResource("users.xml").getPath();
            //getClassLoader()返回:加载此对象所表示的类或接口的类加载器。 
            //public URL getResource(String name)返回:读取资源的 URL 对象;如果找不到该资源,或者调用者没有足够的权限获取该资源,则返回 null。
            //此方法首先搜索资源的父类加载器;如果父类加载器为 null,则搜索的路径就是虚拟机的内置类加载器的路径。
            //public String getPath()获取此 URL 的路径部分。 
            System.out.println(path);
            dom = sax.read(new FileInputStream(path));
        }catch (Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * @return 获取用户的Document
     */
    public static Document getDocument(){
        return dom;
    }
    /**
     * 进行users.xml的保存,保存到本地
     */
    public static void save(){
        try {
            XMLWriter w = new XMLWriter(new FileOutputStream(path));
            w.write(dom);
            w.close();
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e.getMessage(), e);
        } catch (IOException e) {
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    /**
     * 测试用
     * @param args
     */
    public static void main(String[] args){
        System.out.println( getDocument() );
    }
}


index.jsp:


<hr/>
        <h2>以下演示一个小项目---用户注册</h2>
        <h3>用户注册</h3>
        <form action="/myServletDemo/reg" method="post">
            姓名:<input type="text" name="name" /><br/>
            密码:<input type="password" name="pwd"/><br/>
            <input type='submit' value="注册"/>
        </form>
        <br/>
         <a href="/servletDemo/reg">显示所有用户</a>


web.xml:

<servlet>
    <servlet-name>RegServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.day2.RegServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>RegServlet</servlet-name>
    <url-pattern>/reg</url-pattern>     
  </servlet-mapping>
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>DelServlet</servlet-name>
  </servlet>
   <servlet-mapping>
    <servlet-name>DelServlet</servlet-name>
    <url-pattern>/del</url-pattern>
  </servlet-mapping>


RegServlet.java:用户注册:

package cn.hncu.servlet.day2;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import cn.hncu.factory.Dom4jFactory;
public class RegServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        Document dom = Dom4jFactory.getDocument();
        //获得所有用户信息
        List<Element> users = dom.selectNodes("//user");
        out.print("<html><body>");
        for(Element e :users){
            String id = e.attributeValue("id");
            System.out.println(id);
            String del = "&nbsp;&nbsp;&nbsp;&nbsp;<a href='/myServletDemo/del?id="+id+"'>删除</a>";
            //System.out.println(e.attributeValue("name")+","+e.attributeValue("pwd"));
            out.print("用户名:"+e.attributeValue("name")+",密码:"+e.attributeValue("pwd")+del+"<br/>");
        }
        out.print("<a href='javascript:history.go(-1);'>返回</a>");
        out.print("</body></html>");
    }
    //处理用户注册的表单请求
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        Document dom = Dom4jFactory.getDocument();
        PrintWriter out = response.getWriter();
        //防护,如果用户已经存在,就给前端发送换一个用户名的信息。
        //xpath
        Node node = dom.selectSingleNode("//user[@name='"+name.trim()+"']");
        if(node!=null){//用户名已经存在,不能注册
            out.print("该用户名已经存在,请换一个!");
            //添加一个返回的链接
            out.print("&nbsp;&nbsp;<a href='javascript:history.go(-1);'>返回</a>");
        }else{//可以注册
            Element root = dom.getRootElement();
            Element elem = root.addElement("user");
            elem.addAttribute("id", UUID.randomUUID().toString().replaceAll("-", ""));
            //replaceAll(String regex, String replacement)  使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
            elem.addAttribute("name", name);
            elem.addAttribute("pwd", pwd);
            //存
            Dom4jFactory.save();
            //返回注册成功
            out.print("恭喜,注册成功。");
            //添加一个返回的链接
            out.print("&nbsp;&nbsp;<a href='javascript:history.go(-1);'>返回</a>");
        }
    }
}


DelServlet.java-实现删除功能:

package cn.hncu.servlet.day2;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Document;
import org.dom4j.Node;
import cn.hncu.factory.Dom4jFactory;
public class DelServlet extends HttpServlet {
    //只需要get方式就可以了。
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String delId = request.getParameter("id");
        Document dom = Dom4jFactory.getDocument();
        Node node = dom.selectSingleNode("//user[@id='"+delId+"']");
        if(node!=null){
            node.getParent().remove(node);
            Dom4jFactory.save();
        }
        //重定向-继续返回当前页面
        response.sendRedirect("/myServletDemo/reg");
    }
}

id的传递用get方式传递的,?号后面的就是id。


演示结果:


注册一个name为张三的用户:


image.png


服务器中users.xml的绝对路径:


image.png


可以看到,多了一个user标签:


image.png


显示所有的用户:(多注册几个)


image.png


如果出现重名的情况:


image.png


删除链接:?号后跟着的是用户的id


image.png


点击删除后:用户被删除。


image.png


注意一点的是:

这个服务器中的users.xml文件和之前myeclipse中的users.xml已经不同了,你注册后,只会把服务器中的users.xml文件修改,而不会去改myeclipse中的users.xml文件,所以,如果你用myeclipse再重新发布,会把你服务器中的那个文件数据全部冲掉。。。。。注意哦。


目录
相关文章
|
4天前
|
前端开发 Java 数据库
玩转springboot之springboot注册servlet
在Spring Boot中注册Servlet非常灵活,可以通过 `@WebServlet`注解快速注册,也可以通过 `ServletRegistrationBean`进行细粒度控制。通过这两种方式,可以满足各种场景下的需求,确保应用能够高效处理HTTP请求。
32 14
|
3月前
|
前端开发 数据安全/隐私保护
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
本文档详细介绍了HTML表单的多种元素及其用法,包括下拉菜单(`&lt;select&gt;` 和 `&lt;option&gt;`)、文本域(`&lt;textarea&gt;`)、标签解释(`&lt;label&gt;`)、各类按钮(`&lt;button&gt;`)及表单重置功能、无语义布局标签(`&lt;div&gt;` 和 `&lt;span&gt;`)以及字符实体的应用。此外,还提供了一个完整的注册信息表单案例,涵盖个人信息、教育经历和工作经历等部分,展示了如何综合运用上述元素构建实用的表单。
【前端web入门第二天】03 表单-下拉菜单 文本域 label标签 按钮 【附注册信息综合案例】
|
2月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
43 0
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
45 1
|
4月前
|
C# 数据可视化 开发者
WPF开发者福音:深度解析OxyPlot与LiveCharts图表库,轻松实现数据可视化不再是难题!
【8月更文挑战第31天】在WPF应用中,数据可视化对提升用户体验至关重要。本文介绍并演示了两种流行图表库OxyPlot和LiveCharts的集成与使用方法。OxyPlot是一款适用于.NET应用的开源图表库,提供多种图表类型,易于集成。LiveCharts则以其丰富的图表类型和动画效果,特别适合实时数据展示。通过具体代码示例,本文展示了如何利用这两种图表库创建折线图和柱状图,并详细说明了安装和配置步骤。希望本文能帮助开发者在WPF应用中轻松实现高效、美观的数据可视化。
251 0
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
89 0
|
4月前
|
监控 前端开发 Java
揭秘Web开发神器:Servlet、过滤器、拦截器、监听器如何联手打造无敌博客系统,让你的用户欲罢不能!
【8月更文挑战第24天】在Java Web开发中,Servlet、过滤器(Filter)、拦截器(Interceptor,特指Spring MVC中的)及监听器(Listener)协同工作,实现复杂应用逻辑。以博客系统为例,Servlet处理文章详情请求,过滤器(如LoginFilter)检查登录状态并重定向,Spring MVC拦截器(如LoggingInterceptor)提供细粒度控制(如日志记录),监听器(如SessionListener)监控会话生命周期事件。这些组件共同构建出高效、有序的Web应用程序。
42 0
|
6月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
140 10
|
6月前
|
缓存 负载均衡 安全
Servlet与JSP在Java Web应用中的性能调优策略
【6月更文挑战第23天】在Java Web中,Servlet和JSP调优至关重要,以应对高并发和复杂业务带来的性能挑战。优化包括Servlet复用、线程安全、数据库连接池,以及JSP的编译优化、使用JSTL、页面缓存和静态内容分离。全局优化涉及负载均衡、异步处理和缓存策略。通过这些实践,开发者能提升应用响应速度和吞吐量,确保高负载下的稳定运行。
94 7
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
169 3