个人整理非商业用途,欢迎探讨与指正!!
可以完成servlet向页面的跳转
普通的页面跳转,发起者是response
response.sendRedirect(路径);
路径:可以是html,jsp,servlet等
重定向的应用:增删改
重定向是两次请求,url停留在最后一次请求
response.sendRedirect("MyServlet");
转发是服务器端行为
将第一个请求转发给第二次请求,将两个请求转换为一次
地址栏是第一次请求的位置
请求转发的应用:查询
// 请求转发 RequestDispatcher转发对象
request.getRequestDispatcher("MyServlet").forward(request, response);
servlet的页面跳转不用同时使用多次,一个Servlet中的页面跳转只有一次
关于传值:
?请求转发时使用request域
?重定向时使用session域
web项目有两个地址
?1.物理地址,源码存放的位置
?2.服务器地址,项目打包后的运行地址
??组成是由:项目名+WebContent下的代码组成的
??服务器下是在WEB-INF下的classes存放java的字节码
一种软件工程模式,把系统分为三层:Model(模型层) View(视图层) Controller(控制层)
MVC设计模式不是Java独有的
MVC设计模式被广泛的应用到Java框架中,例如:SpringMVC框架(基于Servlet),Structs2框架(基本Filter)等框架都是MVC设计模式的思想体现
M:主要是负责数据交互和业务逻辑的,项目中的体现是DAO层和Service层;
?POJO实体类,在M层负责数据交互的载体(查询的结果,添加和修改的参数)
V:主要负责显示数据(给用户),和数据提交(给数据库),项目中的体现:WEB层(html,jsp)
C:捕获请求和控制请求的转发,调用Model层,与View进行交互,项目中的体现:Servlet,Controller
架构思想
UI:页面层
BLL:业务逻辑层
DAL:数据访问层
三层架构是基于业务逻辑的,MVC设计模式是一种复合的设计模式,是写代码时要遵守的
JSP刚发布的时间,服务器只有JSP页面,所有的内容都在JSP中完成(包括JDBC操作),将所有的内容都混在一起,对后期的维护和扩展非常不利
例如:JSP页面中有一个jsp:javaBean的标签,创建pojo类
清晰了MVC设计模式,我们可以快速的编写事务/业务,例如:转账,买书,购物车等功能
单一职责原则 一个类或者一个接口或一个方法只完成一项功能
开闭原则 扩展开放,修改关闭
里氏替换原则 多态,子类可以扩展父类的功能,但不能改变原有父类的功能
依赖倒置原则 面向接口编写
接口隔离原则 将接口尽可能的细化,每个接口的功能尽量不要太多
迪米特原则 最少知道原则,降低类和类之间的耦合度
<% %>的替代品,简化JSP开发
语法:${}
JSP域对象 | EL域对象 |
---|---|
pageContext | pageScope |
request | requestScope |
session | sessionScope |
application | applicationScope |
说明: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>
隐式对象 | 说明 |
---|---|
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>
<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>
配合EL一起使用,简化JSP页面的
在JSP1.0时代,EL是JSTL的一部分,随着MVC的出现,EL独立了
需要引入第三方jar包(JSTL标签库)
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>
主要使用的是日期格式转换
< !-- 引入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>