JavaEE学习笔记 2024-1-17 --请求转发和重定向、MVC设计模式

发布时间:2024年01月18日

? 上一篇

个人整理非商业用途,欢迎探讨与指正!!



7.请求转发和重定向

可以完成servlet向页面的跳转

7.1重定向

普通的页面跳转,发起者是response
response.sendRedirect(路径);
路径:可以是html,jsp,servlet等
重定向的应用:增删改

重定向是两次请求,url停留在最后一次请求

response.sendRedirect("MyServlet");

7.2请求转发

转发是服务器端行为
将第一个请求转发给第二次请求,将两个请求转换为一次
地址栏是第一次请求的位置

请求转发的应用:查询

//		请求转发 RequestDispatcher转发对象
request.getRequestDispatcher("MyServlet").forward(request, response);

7.3注意

servlet的页面跳转不用同时使用多次,一个Servlet中的页面跳转只有一次
关于传值:
?请求转发时使用request域
?重定向时使用session域

8.项目的地址

web项目有两个地址
?1.物理地址,源码存放的位置
?2.服务器地址,项目打包后的运行地址
??组成是由:项目名+WebContent下的代码组成的
??服务器下是在WEB-INF下的classes存放java的字节码

9.MVC设计模式

一种软件工程模式,把系统分为三层:Model(模型层) View(视图层) Controller(控制层)
MVC设计模式不是Java独有的
MVC设计模式被广泛的应用到Java框架中,例如:SpringMVC框架(基于Servlet),Structs2框架(基本Filter)等框架都是MVC设计模式的思想体现

9.1MVC设计模式和三层架构的区别

9.1.1MVC的三层

M:主要是负责数据交互和业务逻辑的,项目中的体现是DAO层和Service层;
?POJO实体类,在M层负责数据交互的载体(查询的结果,添加和修改的参数)
V:主要负责显示数据(给用户),和数据提交(给数据库),项目中的体现:WEB层(html,jsp)
C:捕获请求和控制请求的转发,调用Model层,与View进行交互,项目中的体现:Servlet,Controller

9.1.2三层架构的三层

架构思想
UI:页面层
BLL:业务逻辑层
DAL:数据访问层
三层架构是基于业务逻辑的,MVC设计模式是一种复合的设计模式,是写代码时要遵守的

9.2JavaWEB的两个时期

9.2.1JSP Model1

JSP刚发布的时间,服务器只有JSP页面,所有的内容都在JSP中完成(包括JDBC操作),将所有的内容都混在一起,对后期的维护和扩展非常不利
例如:JSP页面中有一个jsp:javaBean的标签,创建pojo类

9.2.2JSP Model2

清晰了MVC设计模式,我们可以快速的编写事务/业务,例如:转账,买书,购物车等功能

9.3程序设计的六大原则

单一职责原则 一个类或者一个接口或一个方法只完成一项功能
开闭原则 扩展开放,修改关闭
里氏替换原则 多态,子类可以扩展父类的功能,但不能改变原有父类的功能
依赖倒置原则 面向接口编写
接口隔离原则 将接口尽可能的细化,每个接口的功能尽量不要太多
迪米特原则 最少知道原则,降低类和类之间的耦合度

10.EL表达式和JSTL脚本库

10.1EL表达式

<% %>的替代品,简化JSP开发

语法:${}

10.1.1域对象
JSP域对象EL域对象
pageContextpageScope
requestrequestScope
sessionsessionScope
applicationapplicationScope

说明:EL中使用域对象时,可以省略域名,若在域中重名了,则从最小的域中获取数据

<body>
<%
	// 模拟Servlet操作
	request.setAttribute("name", "zs");

	// 转发到EL.jsp页面
	session.setAttribute("name", "ww");
%>

<%
	String name = (String)request.getAttribute("name");
%>
<%=name %>

<br>
${requestScope.name }
<!-- 表示域时,域对象可以省略 -->
<br>
${name }
<br>
${sessionScope.name }
<br><!-- 域中数据重名时,省略写法从小域中找 -->
${name }
</body>
10.1.2EL隐式对象
隐式对象说明
param${param.key}等价与request.getParameter(“key”);
pageContext可以获取到其他的JSP对象信息
cookie获取cookie中的值,${cookie.username}

说明:隐式对象不能省略

<body>
<%
	String username = request.getParameter("username");
	String password = request.getParameter("password");
%>
<%=username %>
<%=password %>
<!-- 请求参数中 -->
${param.username }
${param.password }
<!-- 这是在域中获取对象 -->
${username }
${password }

<!-- 获取request对象 EL中的requestScope是域并不完全的等于request对象 -->
${pageContext.request }
<!-- 获取项目名 -->
${pageContext.request.contextPath }

</body>
10.1.3EL运算符
      • /(div) %(mod) ==(eq) !=(ne) >(gt) <(lt) >=(ge) <=(le) &&(and) ||(or) !(not) empty(判断为空)
<body>
${1 + 1 }
${1 div 1 } ${1 / 1 }

${5 mod 2 }

${1 == 1 }
${1 eq 1 }

${true and false }
${true && false }
<!-- 判断域中的name是否为null -->
${empty name }
</body>

10.2JSTL

配合EL一起使用,简化JSP页面的
在JSP1.0时代,EL是JSTL的一部分,随着MVC的出现,EL独立了
需要引入第三方jar包(JSTL标签库)

10.2.1JSTL C库

c库
?c:if 分支结构
?c:choose 多重分支结构
?c:foreach 循环结构

<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>

c:if

<% request.setAttribute("score", 70); %>
<c:if test="${score >= 60 }">
	<label>通过</label>
</c:if>
<c:if test="${score < 60 }">
	<label>不通过</label>
</c:if>

c:choose

<% request.setAttribute("score", 71); %>
<c:choose>
	<c:when test="${score > 90 }">
		A
	</c:when>
	<c:when test="${score > 80 }">
		B
	</c:when>
	<c:when test="${score > 70 }">
		C
	</c:when>
	<c:when test="${score > 60 }">
		D
	</c:when>
	<c:otherwise>
		E
	</c:otherwise>
</c:choose>

c:foreach

<body>
<% 
	// 模拟C层操作
	ArrayList<Dog> dogs = new ArrayList<Dog>();
	dogs.add(new Dog(1,"小白","男"));
	dogs.add(new Dog(2,"小黑","男"));
	dogs.add(new Dog(3,"小花","男"));
	dogs.add(new Dog(4,"小华","女"));
	request.setAttribute("dogs", dogs);
%>
<!-- v中 -->
<%ArrayList<Dog> list = (ArrayList<Dog>) request.getAttribute("dogs"); %>
<%for(Dog d : list) { %>
	<div><%=d.getDogid() %></div>
	<div><%=d.getDogname() %></div>
	<div><%=d.getDoggender() %></div>
<%} %>

<hr>
<!-- 
	items是在域中直接过去对应的数组或者集合  
	var将集合或者数组中的数据赋值给var的变量帮助遍历
	begin指定开始
	end指定结尾
	step步长
-->
<c:forEach items="${dogs }" var="d" begin="1" end="3" step="2">
	${d.dogid }---${d.dogname }---${d.doggender }<br>
</c:forEach>
</body>
10.2.2JSTL fmt库

主要使用的是日期格式转换
< !-- 引入fmt库 – >
<%@ taglib prefix=“fmt” uri=“http://java.sun.com/jsp/jstl/fmt” %>

<body>
<%
	Date d = new Date(System.currentTimeMillis());
	request.setAttribute("d", d);
%>

<fmt:formatDate value="${d }"/>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd"/>
<fmt:formatDate value="${d }" pattern="yyyy-MM-dd hh:mm:ss"/>
<fmt:formatDate value="${d }" pattern="hh:mm:ss"/>
</body>
文章来源:https://blog.csdn.net/CHiN_951/article/details/135683377
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。