用户注册项目解析(1)

项目需要完成的界面


html/css/js的文件建在WebContent中,java文件都放在java Resources。


一、保存数据

1.form表单  action=" "  method=“post"”.

2.创建servlet包并且创建出servlet类,打开servlet包中的web.xml找到<url-pattern>复制路径,将路径写入action。

2.1在Servlet中doget方法中自动生成生成的语句删除,然后写doPost(request, response);

在dopost方法中自动生成的语句删除,将在此语句块中写代码。



3.获取表单数据:

①需要考虑内容:在请求体request 拿数据,向后端servlet拿一个请求,请求格式,包括的内容,每一部分的获取。

②解析请求对象request。要符合HTTP协议格式:请求行,请求消息头,空行,请求正文。

3.1请求行含有:请求方法,协议版本,URI。

3.1.1请求方法:request.getMethod():当前次请求的请求方式,用String类型接一下返回值。

3.1.2协议版本:String uri =request.getRequestURI();返回请求uri值(资源路径)。String url =request.getRequestURL();返回地址栏请求路径(网址)。

3.2请求消息头(报头信息)

3.2.1返回当前请求中所有参数信息。

Enumeration<String>  enums =request.getHeaderNames();

3.2.2遍历承接了所有参数的枚举集合,即请求信息。以便判断是否由下一个元素。

while(enums.hasMoreElements()){

            String name = enums.nextElement();

            String  value = request.getHeader(name);

}



3.3请求正文(请求体)

String username = request.getContextPath();获取当前应用的上下文路径,即工程名。(以防改项目名之后导致文件错误时,可用获取到的值去更改)

3.3.1获取表单数据

String  username = request.getParameter("username");传入的参数username,是页面表单控件的name属性,返回的name的值。接下来有多少表单数据获取多少name值。


4.框架搭建(MVC模式):

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写。M是指业务模型,V是指用户界面,C则是控制器。

Model(模型)表示应用程序核心(比如数据库记录列表)。Model(模型)是应用程序中用于处理应用程序数据逻辑的部分。通常模型对象负责在数据库中存取数据。

View(视图)显示数据(数据库记录)。View(视图)是应用程序中处理数据显示的部分。通常视图是依据模型数据创建的。

Controller(控制器)处理输入(写入数据库记录)。Controller(控制器)是应用程序中处理用户交互的部分。通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

4.1在java Resources项下src的servlet包上New一个package建模型层model在model上new3个bean,dao,service包。

5.在表单获取到了数据,接下来保存数据,即业务处理。需要放到service层,即创建一个类class。

思考:service层放什么。

5.1需要一个注册用户的方法(不用返回值),参数多,写过多参数不便于阅读维护,所以需要实体类(即对象)传参。

5.2 bean包new一个实体类,并封装所有属性。private 所有属性并获取get和set方法。注意:实体类名前两个字母不能大写。


不完整截图

5.3回到service层将实体类做参数传入并引包。

5.4由于service层中都是方法,要是想调用就要在servlet中new然后调用过于繁琐,不利于后期拓展,所以做一个单例模式,仅用一个对象,既省内存又便于拓展。

5.5封装数据,在servlet中创建一个u对象,接信息。

  UserDaoImp dao= new UserDaoImp(); //拿对象

  dao.registerUser(u);//调用方法

5.6调用service层方法进行业务处理。

6.获取到的数据存到数据库,dao包放数据库交互,dao层用接口以便于拓展。

6.1创建interface接口UserDao,提供一个有参无返回值方法(没有方法体),注册抽象方法。

public interface UserDao {

         public void registerUser(Userinfo u)

}

6.2创建class类UserDaoImp实现 UserDao接口,实现UserDao的注册方法,并且有参有返回值(有方法体)。

```

public class UserDaoImp implements UserDao{

        public void registerUser(Userinfo u){

}

```

6.3 service层中有业务,和事务两种。先写业务,注册属于业务。service中单例模式下方继续写业务处理。

```

public void register(Userinfo u) {       //用户注册

             UserDaoImp dao= new  UserDaoImp ()         // new    实现类对象     

               dao. registerUser(u);             //调用该实现类的方法

}

```

6.4事务处理,数据的增删改查。数据要做到交互的一致性,要么同时成功要么同时失败。 JDBC数据库连接时自动提交无法保证同时成功同时失败。

6.4.1不允许自动提交,改手动提交,无论调用几次dao保证一个连接。

6.4.2获取数据库连接,加载驱动引入jar包,jar包放在WEB-INF下的lib文件夹,然后try catch异常处理一下。


引jar包

```

  Class.forName("com.mysql.cj.jdbc.Driver");    //加载驱动

    Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/scott?useSSL=FALSE&serverTimezone=UTC","root", "root");      //获取连接

```


在try语句块中加入conn.setAutoCommit(false)取消jdbc的自动提交。

6.4.3.1调用dao层方法,需要将连接作为参数传进去,即将之前的语句改成dao.registerUser(u,conn)

6.4.3.2打开EmpDaoImp加入Connection类型参数conn,即将之前的语句改成public void registerUser(Userinfo u, Connection conn){}。

打开EmpDao加入Connection类型参数conn,即将之前的语句改成public void registerUser(Userinfo u ,Connection conn)

6.5运行过程。进到service里拿到连接,数据库取消自动提交,取消提交之后连接对象传到dao层,进到UserDaoImp写SQL语句。然后try catch一下,给参数赋值,然后加上执行语句,执行完这次与数据库的交互需要关闭,加finally语句块,由于ps是局部变量所以将ps提取出来,colse方法需要try catch一下。

```

PreparedStatement ps =null;

try {

ps=conn.prepareStatement("insert into "

+"userinfo(username,password,realname,email,phone,role)"

+"  values(?,?,?,?,?,?) ");

ps.setString(1, u.getUsername());

ps.setString(2, u.getPassword());

ps.setString(3, u.getRealname());

ps.setString(4, u.getEmail());

ps.setString(5, u.getPhone());

ps.setString(6, u.getRole());

ps.executeUpdate();

} catch (SQLException e) {

e.printStackTrace();

}finally{

try {

ps.close();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

```

6.6加入手动提交和回滚,只要不进异常就提交,只要异常就回滚。所以在try最后加提交,异常语句块加回滚。由于connection是局部变量,catch语句块想要使用就需要将connection提取到外面。去掉子层异常留exception。conn.rollback();需要try catch。


6.7去servlet的dopost中语句块首行代码加设置请求对象的编码格式。

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

总结:html视图层(页面)---->servlet控制层-(发请求)-->模型层(事务业务处理)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容