文章目录
servlet补充
之前的servlet我有一部分忘记讲了,就是这个form表单传值给servlet是怎么匹配的问题
form表单的结构如下:
<form action="" method="get">
账号:<input type="text" name="name">
<br>
密码:<input type="password" name="password">
<br>
<input type="submit" value="注册">
</form>
web.xml配置如下:
<servlet>
<servlet-name>regiter</servlet-name>
<servlet-class>Register</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>regiter</servlet-name>
这里的url-pattern是相对于项目ContextPath(上下文路径)的
<url-pattern>/register</url-pattern>
</servlet-mapping>
要找到对应的servlet需要action填写正确的路径
-
首先明确,action后跟的路径是我们提交的请求发送到的路径。
项目路径如图:
-
action后跟的路径是为了找到web.xml设置的servlet的url-pattern
- 路径前面没有加”/“,是相对路径,相对于项目的ContextPath的,提交表单后会在ContextPath基础上继续追加
- 上面代码的action中的路径前面加上了”/“,是绝对路径,如果提交表单,会覆盖项目的ContextPath,如果Context Path为”/“则和第一种没有区别。
MVC
- M:Model,模型。
- 完成具体的业务操作,如:查询数据库,封装对象
- V:view视图。JSP、HTML等来进行数据展示
- C:Controller控制器。 Servlet
- 获取View的请求
- 调用模型将数据交给视图进行展示
三层架构
界面层[表示层] UI(User Interface layer)
业务逻辑层BLL(Business Logic Layer)
数据访问层DAL(Data access layer)。
两者关系
暑期项目的项目结构分层
总体的项目结构
controller
- 对应MVC的控制器
- 对应三层架构中的表示层的web后台
仅负责前端数据的传输(与前端界面的交互)
dao
- 对应MVC的模型层中的负责与数据库交互的JavaBean
- 对应三层架构中的数据访问层中数据库的增删改查部分
仅负责业务逻辑中与数据库的交互部分
entity实体类
- 对应MVC的模型层中的实体类作业的JavaBean
- 对应三层架构中的数据访问层中数据对象实体类部分
Java是面向对象的编程语言,而面向对象的三大特性中有一点非常重要,就是封装性,实体类就是我们对所研究对象的抽象,我们将该对象所需要使用到的性质封装到的实体类的私有成员变量中。
我们建立数据库的数据表的时候其实也是建立一张属性表,每一条记录相当于一个对象。
所以我们可以利用实体类生成的对象去接收数据库查到的记录,再将这些对象传给前端。
filter过滤器
- 属于MVC的控制器层的一部分
- 属于三层架构中的表示层的web后台的一部分
可以将一些权限控制,以及处理该业务前需要做的一些预处理操作;处理业务完的后续的一些特殊处理工作放在这个包里。
它的配置也是放在web.xml里的,与servlet类似
(下一节课会详细讲述这部分)
service
- 对应MVC的模型层的处理业务逻辑的部分
- 对应三层架构中的业务逻辑层
service接口置于service包下,里面存放着很多处理业务逻辑的方法。
impl里是实现该接口的类,存放对应接口里每个方法实现的逻辑。命名一般与对应接口名也相对应。
例如:CheckService的实现类命名为CheckServiceImpl这样可以更清楚、更有条理地管理业务逻辑。(dao也可以这样写,更清楚一些)
强调:这个包下只放置业务逻辑部分的代码!
util工具类
放置需要经常使用到的工具类,比如你们已经学过的JDBC的连接配置及需要经常用的方法。
里面一般都是静态方法,直接用工具类的类名即可调用该方法,便于使用。
test
这里面放的是测试类,里面可以写一些需要测试正确性的代码,可以直接运行查看该段代码的执行结果。
需要导入junit的jar包,才可使用。
(后面有一节课会详细讲述这部分)
web
这个当然不用多说,现在大家现在一个都应该会建立web项目,以及为项目添加jar包了。
三种架构的联系
我们的项目结构将mvc中的模型层根据三层架构在原来的基础上进行了细化,将数据访问和业务逻辑拆分开来,降低耦合度,提高了代码的利用率。
举个例子
实现注册的业务
要求用户信息存入数据库;
存入前查询该用户名是否重复,未重复方可注册;
- entity下建立一个User实体类、数据库建立相对应的表;
- util下放入JDBC的配置工具类;
- controller下建立一个register类接收前端传来的用户名、密码数据;
- web下配置xml文件;
- dao下建一个RegisterDao类,里面写了返回数据库内用户名为该用户名的记录的方法getUserByName()以及将该用户信息存入数据库的方法addUser();
- service下建一个RegisterService接口,一个RegisterServiceImpl类实现该接口。里面写了先调用RegisterDao类的getUserByName()判断是否已有该用户名记录,如果没有再调用addUser()方法的逻辑方法。该方法将是否用户名重复作为返回值。
- controller调用RegisterService接口中的该方法,得到返回值,将返回值以设定的形式传给前端。
小技巧
一般要实现的业务功能有很多,所以会有很多controller,以及很多个请求路径,web.xml文件也会很冗长。
解决方法
web.xml
<servlet>
<servlet-name>Login</servlet-name>
<!--对应的登录注册相关的controller都写在LoginController里-->
<servlet-class>controller.LoginController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<!--映射所有为“/user/”型式的请求路径-->
<url-pattern>/user/*</url-pattern>
</servlet-mapping>
LoginController.java
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求路径
String uri = req.getRequestURI();
switch (uri){
case "/user/login":
//doLogin(req,resp)里写登录的相关操作
doLogin(req,resp);
break;
case "/user/register":
doRegister(req,resp);
break;
case "/user/exit":
doExit(req,resp);
break;
}
}
小作业(不做强制要求)
将之前登录注册的代码按照今天讲的这个逻辑进行分层,并且保证能够跑通。
- 之前有部分同学直接结合JDBC写的登录注册,按照逻辑分层改一下即可
- 没有结合JDBC写的学弟学妹,如果有时间的话可以结合JDBC分层改一下原项目或新建一个项目;没有时间的话,在原项目上分个层即可
交给我或者交给其他学长学姐都可以哦~