项目需要完成的界面


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异常处理一下。

```
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控制层-(发请求)-->模型层(事务业务处理)。