Java Web开发模式
一、Java Web开发模式
1.javaBean简介
JavaBeans是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。 --from 维基百科
JavaBean是一种可重复使用、且跨平台的软件组件。JavaBean可分为两种:
- 一种是有用户界面(UI,User Interface)的JavaBean;
- 另一种是没有用户界面,==重要负责处理事务(如数据运算,操纵数据库)的JavaBean
1)特点:
- JavaBean是一种Java类,而且是一种特殊的、可重用的类。
- JavaBean必须具有无参数的构造器,所有的属性都是private的,通过提供setter和getter方法来实现对成员属性的访问。
- Javabean 是为了和 jsp 页面传数据化简交互过程而产生的。
2.开发模式分类
- 模式一(JSP+JavaBean): 轻便、机动,在小规模、业务逻辑简朴的项目开发中有一定上风,开发效率高
JSP页面通过JavaBean处理数据,响应请求并返回效果
- 模式二(JSP+Servlet+JavaBean): 步伐条理清晰、分工明确,可维护性、扩展性高,尤其在规模较大或是业务逻辑复杂的项目中倾向使用
1)模式一特点
- 模式 一 体系布局用于开发简朴的应用步伐
- 模式 一体系布局包括多个用户可与之交互的页面
- 客户端可以或许直接访问到服务器上的JSP页面
- 在采用模式 一 开发的Web 应用步伐中稠浊了大量的业务逻辑代码,HTML内容、Java代码交织在一起,使步伐的维护性和扩展性较差
- 在JSP页面中可以通过链接等方式直接转向其他页面。在业务逻辑较为复杂的项目中管理页面流程较为困难。
2)模式二特点
模式 二 体系布局联合使用 JSP 页面、Servlet和 JavaBean 来开发 Web 应用步伐
二、MVC模式
1.简介
MVC是英文“Model-View-Controller”的缩写,最初是在Smalltalk-80中被用来构建用户界面的。此中M代表模型Model,V代表视图View,C代表控制器Controller。
通过模型视图控制器来
采用MVC模式的目的,就是为了增长代码的重用率,淘汰数据表达、数据描述和提高应用操作的偶合度。同时也使得软件的可维护性、可修复性、可扩展性、机动性以及封装性大大提高。
2.MVC模式布局
MVC,把一个应用的输入、处理、输出流程按照Model、View、Controller的方式举行分离,这样一个应用将被分成三层:模型层、视图层、控制层。
- 输入>>模型层(Model)
- 处理>>视图层(View)
- 输出>>控制层(Controller)
controller负责处理客户端发送的请求,颠末service层业务处理并间接调用mapper接口层的数据库操作,后将效果返回给视图层
客户端请求>>controller>>service>>mapper
1)Model层
分为: DAO层、service层
- DAO层:
负责访问数据库举行数据的操作,取得效果集之后将效果会合的数据取出封装到VO类对象之后返回给service层
负责数据库操作,取得效果返回给service层
- public interface HrMapper {
- int deleteByPrimaryKey(Long id);
- int insert(Hr record);
- int insertSelective(Hr record);
- Hr selectByPrimaryKey(Long id);
- int updateByPrimaryKeySelective(Hr record);
- int updateByPrimaryKey(Hr record);
- Hr login(@Param("username") String username, @Param("password") String password);
- List<Hr> queryAll();
- List<Hr> queryByUsername(String username);
- }
复制代码 - service层:
重要负责一些业务处理,好比多个操作需要放在一个事务中举行管理,事务回滚,一些复杂的逻辑业务处理就放到service层
通过调用DAO层接口实现业务功能
Service层的业务实现,详细要调用到已定义的DAO层的接口。封装Service层的业务逻辑有利于通用的业务逻辑的独立性和重复使用性。
- @Service("hrService")
- public class HrServiceImpl implements HrService {
- @Autowired
- private HrMapper hrMapper;
- @Override
- public Hr login(String username, String password) {
- return hrMapper.login(username, password);
- }
- @Override
- public List<Hr> queryAll() {
- return hrMapper.queryAll();
- }
- @Override
- public int insertSelective(Hr record) {
- return hrMapper.insertSelective(record);
- }
- @Override
- public int deleteByPrimaryKey(Long id) {
- return hrMapper.deleteByPrimaryKey(id);
- }
- @Override
- public Hr selectByPrimaryKey(Long id) {
- return hrMapper.selectByPrimaryKey(id);
- }
- @Override
- public int updateByPrimaryKeySelective(Hr record) {
- return hrMapper.updateByPrimaryKeySelective(record);
- }
- @Override
- public List<Hr>queryByUsername(String username) {
- return hrMapper.queryByUsername(username);
- }
- }
复制代码 2)View层
负责处理用户界面的表现细节,以及怎样向用户展示业务处理的效果(页面效果)
- <%@ page import="com.woniuxy.hrms.entity.Hr" %>
- <%@ page import="java.util.List" %>
- <%@ page contentType="text/html;charset=UTF-8" language="java" %>
- <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
- <%
- String path = request.getContextPath();
- String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
- %>
- <base href="<%=basePath%>"/>
- <!DOCTYPE html>
- <head>
- <meta charset="UTF-8">
- <title>Title</title>
- </head>
- <link rel="stylesheet" type="text/css" href="static/bootstrap/css/bootstrap.min.css">
- <script type="text/javascript" src="static/bootstrap/js/bootstrap.min.js"></script>
- <script type="text/javascript" src="static/bootstrap/js/jquery.min.js"></script>
- <script type="text/javascript">
- function check(id) {
- var flag = confirm("确认要删除吗?");
- if (flag) {
- //删除确认,服务器请求跳转至delete方法处理数据库数据
- location.href = "hr/delete?id=" + id;
- }
- }
- </script>
- <body>
- <div class="container" style="padding-top: 40px;">
- <div class="form-group">
- <div class="row">
- <div class="col-md-8">
- <form id="searchForm" action="hr/queryByUsername" method="post">
- <input type="text" class="form-control" id="selectUserName" name="username"
- placeholder="请输入用户名"/>
- <button type="submit" class="btn btn-danger search" id="searchBtn">搜索</button>
- </form>
- </div>
- <div class="col-md-3">
- <a class="btn btn-round btn-square btn-default" href="manage/hr/add.jsp">添加<i
- class="mdi mdi-eye"></i></a>
- <!-- <button class="btn btn-default add" data-toggle="modal" data-target="#addModel">增加</button>-->
- </div>
- </div>
- </div>
- <%
- List<Hr> list = (List<Hr>) request.getAttribute("list");
- %>
- <table class="table table-bordered text-center">
- <tr>
- <td>编号</td>
- <td>姓名</td>
- <td>用户名</td>
- <td>电话</td>
- <td>地址</td>
- <td>操作</td>
- </tr>
- <%-- 迭代集合--%>
- <%
- for (Hr hr : list) {
- %>
- <tr>
- <td><%=hr.getId()%>
- </td>
- <td><%=hr.getRealName()%>
- </td>
- <td><%=hr.getUsername()%>
- </td>
- <td><%=hr.getPhone()%>
- </td>
- <td><%=hr.getAddress()%>
- </td>
- <td>
- <%-- 点击编辑链接,传递当前对象id,并向服务器发送请求--%>
- <%-- href="hrms/queryById?id=<%=hr.getId()% 查询字符串以?字符开始 --%>
- <%-- <%=hr.getId()%>jsp脚本表达式 --%>
- <a class="btn btn-round btn-square btn-info" href="hr/queryById?id=<%=hr.getId()%>">编辑<i
- class="mdi mdi-eye"></i></a>
- <a class="btn btn-round btn-square btn-warning" href="javascript:check(<%=hr.getId()%>)">删除<i
- class="mdi mdi-eye"></i></a>
- </td>
- </tr>
- <%
- }
- %>
- </table>
- </div>
- </body>
- </html>
复制代码 3)Cotroller层
处理客户端请求
叫做控制层,重要的功能是处理用户发送的请求。
负责协调视图与模型,在两者之间处于桥梁和纽带的位置
- public class BaseServlet extends HttpServlet {
- //HttpServlet生命周期: 初始化init(),服务运行service(),销毁destroy()
- //1.init()仅加载一次
- //2.service()随时响应客户端请求,每次获取请求对象调用此方法
- //3.destroy()仅调用一次, 释放servlet所占用的资源。如关闭文件输入输出流,关闭与数据库的连接。
- //多次调用,每次服务器获取请求对象调用service方法,随时响应客户端请求
- @Override
- protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //获取请求路径
- String requestURI = req.getRequestURI();
- //检索请求路径最后的方法名
- String methodName = requestURI.substring(requestURI.lastIndexOf("/") + 1);
- Method declaredMethod;
- try {
- //动态调用对象方法
- declaredMethod = this.getClass().getDeclaredMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
- declaredMethod.invoke(this, req, resp);
- } catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) {
- throw new RuntimeException(e);
- }
- }
- }
复制代码- @WebServlet(value = "/hr/*", loadOnStartup = 1)
- public class HrServlet extends BaseServlet {
- HrService hrService;
- @Override
- public void init(ServletConfig config) throws ServletException {
- ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
- //config.getServletContext()创建ServletContext对象,用来存储applicationContext对象,整个Web应用范围内访问它
- config.getServletContext().setAttribute("applicationContext", applicationContext);
- hrService = applicationContext.getBean("hrService", HrService.class);
- }
- protected void queryByUsername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String username = req.getParameter("username");
- List<Hr> list = hrService.queryByUsername(username);
- list.forEach(System.out::println);
- req.setAttribute("list", list);
- req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp);
- }
- protected void queryAll(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- List<Hr> list = hrService.queryAll();
- req.setAttribute("list", list);
- req.getRequestDispatcher("../manage/hr/show.jsp").forward(req, resp);
- }
- protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // req.setCharacterEncoding("utf-8");
- Hr hr = new Hr();
- hr.setRealName(req.getParameter("realName"));
- hr.setUsername(req.getParameter("username"));
- hr.setAddress(req.getParameter("address"));
- hr.setPhone(req.getParameter("phone"));
- System.out.println(hr);
- int i = hrService.insertSelective(hr);
- //数据库添加数据,并重新调用queryAll走页面展示流程
- queryAll(req, resp);
- }
- protected void queryById(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String id = req.getParameter("id");
- Hr hr = hrService.selectByPrimaryKey(Long.parseLong(id));
- req.setAttribute("hr", hr);
- // 跳转页面,带着对象forward(),地址栏不变
- req.getRequestDispatcher("../manage/hr/update.jsp").forward(req, resp);
- // 单纯跳转页面,并不能携带对象,地址栏更新
- // resp.sendRedirect("/hr/update.jsp");
- }
- protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- // req.setCharacterEncoding("utf-8");
- Hr hr = new Hr();
- //更新必须有id,负责更新所有内容,依据id更新
- // where dept_id = #{deptId,jdbcType=INTEGER}
- //获取页面update.jsp请求对象传递的参数
- hr.setId(Integer.parseInt(req.getParameter("id")));
- hr.setRealName(req.getParameter("realName"));
- hr.setUsername(req.getParameter("username"));
- hr.setAddress(req.getParameter("address"));
- hr.setPhone(req.getParameter("phone"));
- int update = hrService.updateByPrimaryKeySelective(hr);
- //更新完显示全部数据(查询全部数据反馈给show.jsp)
- queryAll(req, resp);
- }
- protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- String id = req.getParameter("id");
- hrService.deleteByPrimaryKey(Long.parseLong(id));
- queryAll(req, resp);
- }
- protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
- //负责处理login.jsp提交
- //获取提交对象的username和password
- String username = req.getParameter("username");
- String password = req.getParameter("password");
- Hr hr = hrService.login(username, password);
- //
- HttpSession session = req.getSession();
- session.setAttribute("hr", hr);
- if (hr != null) {
- //本地存储,在浏览器存储数据
- Cookie[] cookies = req.getCookies();
- boolean flag = false;
- for (Cookie cookie : cookies) {
- String name = cookie.getName();
- if (name.equals("username")) {
- flag = true;
- }
- }
- if (!flag) {
- Cookie username1 = new Cookie("username", username);
- Cookie password1 = new Cookie("password", password);
- //设置cookie存储路径
- username1.setPath("/hrms");
- password1.setPath("/hrms");
- username1.setMaxAge(60 * 60 * 24);
- password1.setMaxAge(60 * 60 * 24);
- resp.addCookie(username1);
- resp.addCookie(password1);
- }
- //路径可以: ../或/hrms根路径下的页面
- resp.sendRedirect("/hrms/admin.jsp");
- } else {
- resp.sendRedirect("../login.jsp");
- }
- }
- }
复制代码 3.MVC的长处:
- 1、耦合性低
视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码,同样,一个应用的业务流程或者业务规则的改变只需要改动MVC的模型层即可。由于模型与控制器和视图相分离,所以很容易改变应用步伐的数据层和业务规则。
- 2、重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,由于多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),好比,用户可以通过电脑也可通过手机来订购某样产物,固然订购的方式不一样,但处理订购产物的方式是一样的。由于模型返回的数据没有举行格式化,所以同样的构件能被不同的界面使用。
- 3、部署快,生命周期成本低
MVC使开发和维护用户接口的技术含量低落。使用MVC模式使开发时间得到相称大的缩减,它使步伐员(Java开发职员)会合精神于业务逻辑,界面步伐员(HTML和JSP开发职员)会合精神于表现情势上。
- 4、可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
4.MVC框架
- Struts2框架:Struts2是基于MVC的轻量级的web应用框架
规则。
- 2、重用性高
MVC模式允许使用各种不同样式的视图来访问同一个服务器端的代码,由于多个视图能共享一个模型,它包括任何WEB(HTTP)浏览器或者无线浏览器(wap),好比,用户可以通过电脑也可通过手机来订购某样产物,固然订购的方式不一样,但处理订购产物的方式是一样的。由于模型返回的数据没有举行格式化,所以同样的构件能被不同的界面使用。
- 3、部署快,生命周期成本低
MVC使开发和维护用户接口的技术含量低落。使用MVC模式使开发时间得到相称大的缩减,它使步伐员(Java开发职员)会合精神于业务逻辑,界面步伐员(HTML和JSP开发职员)会合精神于表现情势上。
- 4、可维护性高
分离视图层和业务逻辑层也使得WEB应用更易于维护和修改。
4.MVC框架
- Struts2框架:Struts2是基于MVC的轻量级的web应用框架
- SpringMVC:Spring家属产物,我们后期重点使用的框架
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |