JSP详解与MVC开发模式介绍

1、JSP的3大指令

  • 在上一期会话技术的学习中,我 详细介绍了JSP是如何出现以及它的本质,JSP本质是一个servlet,它的出现是为了简化响应页面的书写,这篇文章中我总结了JSP是如何简化书写页面的;
  • 指令:配置JSP页面的属性或者导入一些额外的内容
  • 格式:
<%@ 指令名称 属性名="属性值" %>
  • 分类:
page:配置JSP页面的属性
include:静态包含
taglib:导入额外的内容
  • page指令:
language:指定jsp页面使用的语言,只有一个值 java

import:导入软件包

pageEncoding:设置页面编码
1.指定jsp文件的编码
2.告诉浏览器页面使用的编码格式

autoFlush:自动刷新
buffer:缓冲区大小
		
errorPage:指定错误页面,当页面发生异常时,指定跳转的页面,一般在开发完成后,会在web.xml中通过<error-page>标签来配置整个项目的错误页面

代码示例:

<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="utf-8" autoFlush="true" buffer="8kb" %>
<html>
<head>
    <title>$Title$</title>
</head>
<body>
    <%
        ArrayList<Integer> list = new ArrayList<>();
    %>
</body>
</html>

错误页面的配置:

我们给自己的web项目定义两个错误页面,一个是404,一个是500,并通过page指令将他们指定为错误页面,并在web.xml中进行配置,都是为了照顾用户体验;

web.xml的配置:

<error-page>
        <error-code>404</error-code>
        <location>/404.jsp</location>
</error-page>

<error-page>
        <error-code>500</error-code>
        <location>/500.jsp</location>
</error-page>

404页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true"%>
<html>
<head>
    <title>404</title>
</head>
<body>
    <h1>你访问的页面没有找到,请检查输入的路径</h1>
</body>
</html>

在这里插入图片描述
500页面:

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>500</title>
</head>
<body>
    <h1>服务器正忙,请稍后访问。。。。。</h1>
</body>
</html>

在这里插入图片描述

  • taglib指令:

导入额外的内容,如:导入JSTL标签

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  • include指令:

作用是抽取公共页面,其他页面引入;

静态包含 <%@include file="public.jsp" %>	

包含后,编译发现只会存在一个.class文件,包含的public.jsp不会转为一个单独的java类,作为静态代码块存在原来的servlet中;

2、JSP的6个动作标签

  • 动作标签的作用是用来简化Java脚本的,简化书写,提高可读性;JSP动作标签是JavaWeb内置的动作标签,它们是已经定义好的动作标签,我们可以拿来直接使用;

  • 这里介绍一些常用的内置标签,实际还有很多;

  • JSP动作标签的格式:

<jsp:标签名 …>
  • 动作标签:
<jsp:useBean> <===> Person p = new Person()
	使用一个ID和一个给定作用范围和同一ID的JavaBean相关联
<jsp:setProperty>  <===>  p.setName("zhangsan")
	设置JavaBean的属性值
<jsp:getProperty>  <===>  String name = p.getName()
    取得JavaBean的属性值

-----其实内部JSP转换引擎会帮我们将上面代码转为创建Student对象,并且获取对象的属性值。用动作标签替代脚本。

代码1:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <jsp:useBean id="p" class="org.westos.demo.Student">
        <jsp:setProperty name="p" property="name" value="张小小"/>
        <jsp:setProperty name="p" property="age" value="25"/>

        <jsp:getProperty name="p" property="name"/>
        <jsp:getProperty name="p" property="age"/>
    </jsp:useBean>
</body>
</html>

在这里插入图片描述

  • 有关JavaBean类以及内省机制

看上面的代码可以发现:实体类Student类是通过反射进行加载的;

<jsp:useBean id="p1" class="cn.itcast.domain.Person" /><!-- 反射 -->

而JSP动作标签中的设置属性值的property属性的值对应的是实体类里面setName的方法,这涉及到了Java中的内省机制,内省机制详解

<jsp:setProperty name="p" property="name" value="张小小"/>
<jsp:setProperty name="p" property="age" value="25"/>

<jsp:getProperty name="p" property="name"/>
<jsp:getProperty name="p" property="age"/>

1、首先理清什么是JavaBean类:

JavaBean:一种符合特定规范的Java类;
私有所有成员变量、提供公共的访问方式 setter 或 getter、提供空参构造;
一般可以存放实体类的包名叫做:domain、pojo、entity、beans包

2、内省其实是Java语言对Bean实体类属性、事件的一种缺省处理方式,Java提供了一套API,通过getName/setName来访问name属性,这就是默认的规则,他们存放在包java.beans

3、内省和反射的区别:在计算机科学中,内省是指计算机程序在运行时(Run time)检查对象(Object)类型的一种能力,通常也可以称作运行时类型检查。 不应该将内省和反射混淆。相对于内省,反射更进一步,是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力。


<jsp:include>  动态包含
请求时文件包含多个.class字节码文件

代码2:

-------demo2.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <jsp:include page="a.jsp"/>
    <h1>这是demo2页面的主体部分</h1>
</body>
</html>

-------a.jsp页面:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <h1>这是a页面,他是一个公共的页面</h1>
</body>
</html>

在这里插入图片描述
在这里插入图片描述


<jsp:forward>   做请求转发,接受用户输入并将请求分派给另一页面
<jsp:param>		传递请求参数

代码3:

-----demo3.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--请求转发--%>
    <jsp:forward page="demo4.jsp">
        <jsp:param name="name" value="zhangsan"/>
        <jsp:param name="pwd" value="123456"/>
    </jsp:forward>

    <%--之前的写法:--%>
    <%
        request.getRequestDispatcher("/demo4.jsp").forward(request,response);
    %>
</body>
</html>

-------demo4.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%=
        request.getParameter("name")
    %>
    <%=
        request.getParameter("pwd")
    %>
</body>
</html>

3、JSP的9个内置对象

  • JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。

  • JSP中9个对象分别为:

这部分内容转载于此

内置对象/作用域(每一种作用域的生命周期是不一样的):
1, application 全局作用域,在整个服务器上保存,所有用户都可使用,重启服务端无效。如果设置过多的的application属性范围会影响服务器性能。
2, session 会话作用域,为请求的客户创建的session对象,在一次会话中有效,客户端、服务端跳转都有效,网页关闭重新打开无效
3, request 请求作用域,触发服务调用的请求,只在一次请求中有效,客户端跳转无效
4, pageContext 页面作用域,该JSP页面的上下文,只在一个页面中保存属性,跳转之后无效

内置对象
5, response 响应对象,对方的应答
6, out 输出流对象,向输出流写入内容的对象
7, page 当前页面对象的实例
8, exception 异常
9, config ServletConfig/FilterConfig对象

1、request对象

  • request 对象是javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等);
 方 法                             说 明
object getAttribute(String name) 返回指定属性的属性值
Enumeration getAttributeNames() 返回所有可用属性名的枚举
String getCharacterEncoding() 返回字符编码方式
int getContentLength() 返回请求体的长度(以字节数)
String getContentType() 得到请求体的MIME类型
ServletInputStream getInputStream() 得到请求体中一行的二进制流
String getParameter(String name) 返回name指定参数的参数值
Enumeration getParameterNames() 返回可用参数名的枚举
String[] getParameterValues(String name) 返回包含参数name的所有值的数组
String getProtocol() 返回请求用的协议类型及版本号
String getServerName() 返回接受请求的服务器主机名
int getServerPort() 返回服务器接受此请求所用的端口号
BufferedReader getReader() 返回解码过了的请求体
String getRemoteAddr() 返回发送此请求的客户端IP地址
String getRemoteHost() 返回发送此请求的客户端主机名
void setAttribute(String key,Object obj) 设置属性的属性值
String getRealPath(String path) 返回一虚拟路径的真实路径
String request.getContextPath() 返回上下文路径

2、response对象

  • response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端;
 方 法                             说 明
String getCharacterEncoding() 返回响应用的是何种字符编码
ServletOutputStream getOutputStream() 返回响应的一个二进制输出流
PrintWriter getWriter() 返回可以向客户端输出字符的一个对象
void setContentLength(int len) 设置响应头长度
void setContentType(String type) 设置响应的MIME类型
sendRedirect(java.lang.String location) 重新定向客户端的请求

3、session对象

  • session对象指的是客户端与服务器的一次会话,从客户端连到服务器的一个WebApplication开始,直到客户端与服务器断开连接为止。它是HttpSession类的实例。Session对象是一个JSP内置对象,它在第一个JSP页面被装载时自动创建,完成会话期管理。从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个客户访问一个服务器时,可能会在这个服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要Session对象session对象具有会话作用域。
       方 法             说 明
long getCreationTime() 返回SESSION创建时间
public String getId() 返回SESSION创建时JSP引擎为它设的唯一ID号
long getLastAccessedTime() 返回此SESSION里客户端最近一次请求时间
int getMaxInactiveInterval() 返回两次请求间隔多长时间此SESSION被取消(ms)
String[] getValueNames() 返回一个包含此SESSION中所有可用属性的数组
void invalidate() 取消SESSION,使SESSION不可用,也称为session自杀
void removeValue(String name) 删除SESSION中指定的属性
void setMaxInactiveInterval() 设置两次请求间隔多长时间此SESSION被取消(ms)

4、application对象

  • application对象实现了用户间数据的共享,可存放全局变量。它开始于服务器的启动,直到服务器的关闭,在此期间,此对象将一直存在;这样在用户的前后连接或不同用户之间的连接中,可以对此对象的同一属性进行操作;在任何地方对此对象属性的操作,都将影响到其他用户对此的访问。服务器的启动和关闭决定了application对象的生命。它是ServletContext类的实例。
    方 法                     说 明
Object getAttribute(String name) 返回给定名的属性值
Enumeration getAttributeNames() 返回所有可用属性名的枚举
void setAttribute(String name,Object obj) 设定属性的属性值
void removeAttribute(String name) 删除一属性及其属性值
String getRealPath(String path) 返回一虚拟路径的真实路径
ServletContext getContext(String uripath) 返回指定WebApplication的application对象
String getMimeType(String file) 返回指定文件的MIME类型
URL getResource(String path) 返回指定资源(文件及目录)的URL路径
InputStream getResourceAsStream(String path) 返回指定资源的输入流
RequestDispatcher getRequestDispatcher(String uripath) 返回指定资源的RequestDispatcher对象
Servlet getServlet(String name) 返回指定名的Servlet
Enumeration getServlets() 返回所有Servlet的枚举
Enumeration getServletNames() 返回所有Servlet名的枚举
void log(String msg) 把指定消息写入Servlet的日志文件
void log(Exception exception,String msg) 把指定异常的栈轨迹及错误消息写入Servlet的日志文件
void log(String msg,Throwable throwable) 把栈轨迹及给出的Throwable异常的说明信息 写入Servlet的日志文件

5、out 对象

  • out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使用 out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据,为其它的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。

  • 有人肯定会想到,这个out内置对象可以用于页面上输出,而response.getWruter().writer()也可以在页面上输出,它们有什么区别?其实out输出的内容都是嵌套在body标签中的,而后者输出在html标签外面,所以推荐使用out内置对象在页面上输出;

   方 法     说 明
void clear() 清除缓冲区的内容
void clearBuffer() 清除缓冲区的当前内容
void flush() 清空流
int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
int getRemaining() 返回缓冲区还剩余多少可用
boolean isAutoFlush() 返回缓冲区满时,是自动清空还是抛出异常
void close() 关闭输出流

6、pageContext 对象

  • pageContext 对象的作用是取得任何范围的参数,通过它可以获取 JSP页面的out、request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。他相当于页面中所有功能的集大成者,它的本类名也叫pageContext。
        方 法             说 明
JspWriter getOut() 返回当前客户端响应被使用的JspWriter流(out)
HttpSession getSession() 返回当前页中的HttpSession对象(session)
Object getPage() 返回当前页的Object对象(page)
ServletRequest getRequest() 返回当前页的ServletRequest对象(request)
ServletResponse getResponse() 返回当前页的ServletResponse对象(response)
Exception getException() 返回当前页的Exception对象(exception)
ServletConfig getServletConfig() 返回当前页的ServletConfig对象(config)
ServletContext getServletContext() 返回当前页的ServletContext对象(application)
void setAttribute(String name,Object attribute) 设置属性及属性值
void setAttribute(String name,Object obj,int scope) 在指定范围内设置属性及属性值
public Object getAttribute(String name) 取属性的值
Object getAttribute(String name,int scope) 在指定范围内取属性的值
public Object findAttribute(String name) 寻找一属性,返回起属性值或NULL
void removeAttribute(String name) 删除某属性
void removeAttribute(String name,int scope) 在指定范围删除某属性
int getAttributeScope(String name) 返回某属性的作用范围
Enumeration getAttributeNamesInScope(int scope) 返回指定范围内可用的属性名枚举
void release() 释放pageContext所占用的资源
void forward(String relativeUrlPath) 使当前页面重导到另一页面
void include(String relativeUrlPath) 在当前位置包含另一文件

7、config 对象

  • config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的getServletConfig() 方法可以获取一个config对象。当一个Servlet 初始化时,容器把某些信息通过config对象传递给这个 Servlet。 开发者可以在web.xml 文件中为应用程序环境中的Servlet程序和JSP页面提供初始化参数。
   方 法                 说 明
ServletContext getServletContext() 返回含有服务器相关信息的ServletContext对象
String getInitParameter(String name) 返回初始化参数的值
Enumeration getInitParameterNames() 返回Servlet初始化所需所有参数的枚举

8、page 对象

  • page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet接口引用的变量,类似于Java编程中的 this 指针;
class getClass 返回此Object的类
int hashCode() 返回此Object的hash码
boolean equals(Object obj) 判断此Object是否与指定的Object对象相等
void copy(Object obj) 把此Object拷贝到指定的Object对象中
Object clone() 克隆此Object对象
String toString() 把此Object对象转换成String类的对象
void notify() 唤醒一个等待的线程
void notifyAll() 唤醒所有等待的线程
void wait(int timeout) 使一个线程处于等待直到timeout结束或被唤醒
void wait() 使一个线程处于等待直到被唤醒
void enterMonitor() 对Object加锁
void exitMonitor() 对Object开锁

9、exception 对象

  • exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象
  • excepation对象和Java的所有对象一样,都具有系统提供的继承结构。
  • exception 对象几乎定义了所有异常情况。在Java程序中,可以使用try/catch关键字来处理异常情况;如果在JSP页面中出现没有捕获到的异常,就会生成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对象。
String getMessage() 返回描述异常的消息
String toString() 返回关于异常的简短描述消息
void printStackTrace() 显示异常及其栈轨迹
Throwable FillInStackTrace() 重写异常的执行栈轨迹

4、EL表达式

  • EL表达式是从JSP2.0开始的的内置表达式语言,它的出现是为了替代<%=……%>的存在,也就是为了简化JSP页面;
  • 作用:
★获取域中数据 
★执行运算 
★获取常见的web对象
★调用java的方法
  • 格式:
${el表达式}

获取域中数据:

1、获取简单数据

${pageScope|requestScope|sessionScope|applicationScope.属性名}

${属性名}:依次从pageContext、request、session、application查找指定属性,若查找到返回值,结束该次查找;若查找不到,返回" "

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
        <%
            request.setAttribute("username", "zhangsan");
            session.setAttribute("pwd", "123456");
            pageContext.setAttribute("age", 12);
            application.setAttribute("tel", 12345678903l);
        %>

        <%--获取request中的数据--%>
        <%--以前的方式:--%>
        <%=request.getAttribute("username")%><br>
        <%=session.getAttribute("pwd")%><br>
        <%=pageContext.getAttribute("age")%><br>
        <%=application.getAttribute("tel")%><br>
        <%--EL表达式--%>
        ${requestScope.username}<br>
        ${sessionScope.pwd}<br>
        ${pageScope.age}<br>
        ${applicationScope.tel}<br>
</body>
</html>

在这里插入图片描述

2、获取复杂数据

获取数组中的数据:
${域中的名称[index]}
获取list中的数据:
${域中的名称[index]}
获取map中的数据:
${域中的名称.键名}

代码:

<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        //往域中存放数组
        request.setAttribute("arr",new String[]{"aa","bb","cc"});
        //往域中存放list集合
        List list = new ArrayList();
        list.add("dd");
        list.add("ee");
        list.add("ff");
        request.setAttribute("list",list);
        //给域中存放map
        Map<String, Object> map = new HashMap<>();
        map.put("username","zhangsan");
        map.put("pwd","123456");
        request.setAttribute("map",map);
    %>

    <%--获取数组中的数据--%>
    ${arr[1]}<br>
    <%--获取list集合中的数据--%>
    ${list[1]}<br>
    <%--获取map集合中的数据--%>
    ${map.username}<br>
</body>
</html>

在这里插入图片描述
3、获取对象中的字段值

${域中javabean名称.bean属性}

代码:

<%@ page import="org.westos.demo.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Student student = new Student();
    student.setName("zhangsan");
    student.setAge(23);
    //将对象放在域中
    request.setAttribute("stu",student);
%>

<%--以前的方式获取对象的值--%>
<%=((Student)request.getAttribute("stu")).getName()%><br>
<%--EL表达式:--%>
<%--这里的age对应的是Student类中的getAage()--%>
${stu.age}
</body>
</html>

在这里插入图片描述

4、执行运算

  • 四则运算、关系(>……)、逻辑(&& ||);
  • 注意:

+:只能进行加法运算,字符串形式数字可以进行加法运算
empty:判断一个容器的长度是否为0(array set list map),还可以判断一个对象是否为空

${empty 域中的对象名称}
取反 not,例如:not empty 
${not empty 域中对象名称},三元运算符
${ 3>4?"yes":"no" }

代码:

<%@ page import="org.westos.demo.Student" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    request.setAttribute("a", 1);
    request.setAttribute("b", 2);
    List list = null;
    request.setAttribute("list", list);
    Student stu = null;
    request.setAttribute("stu", stu);
%>

${a+b}<br>
${a-b}<br>
${a/b}<br>
${a*b}<br>

${empty list}<br>
${not empty stu}
</body>
</html>

在这里插入图片描述

EL的内置对象(了解):

pageScope
requestScope
sessionScope
applicationScope

param
paramValues

header
haederValues

initParam
cookie

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        Cookie cookie = new Cookie("username", "zhangsan");
        response.addCookie(cookie);
    %>
    ${cookie.username.name}<br>
    ${cookie.username.value}<br>
    ${cookie.JSESSIONID.value}<br>

    <%--使用pageContext对象获取项目名--%>
    ${pageContext.request.contextPath}<br>
    <a href="${pageContext.request.contextPath}/demo8.jsp">请点击,使用pageContext内置对象获取项目名</a>
</body>
</html>

在这里插入图片描述

5、JSTL介绍

  • JSTL,即JSP标准标签库,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度;

  • 使用步骤:

1.导入jar包 (jstl.jar和standard.jar)
在这里插入图片描述
2.在页面上导入标签库 <%@taglib prefix="" uri=""%>,例如:

<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • JSTL的分类:
core:核心类库
fmt:格式化|国际化
xml:过时了
sql:过时了
函数库:很少使用
  • core:掌握

★c:if
★c:forEach

c:if——判断

<c:if test="${el表达式}">满足的时候输出的内容</c:if>

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <c:if test="${3>4}">
        3大于4
    </c:if>
    <c:if test="${3<=4}">
        3小于4
    </c:if>

    <c:if test="${empty name}">
        你尚未登陆,请重新登陆
        <a href="${pageContext.request.contextPath}">点击登录</a>
    </c:if>
</body>
</html>

在这里插入图片描述
c:forEach——循环

  • 格式1:
<c:forEach begin="从那里开始" end="到那里结束" step="步长" var="给变量起个名字" varStatus="循环状态变量">
	${i }--${vs.count }--${vs.current }<br>
</c:forEach>

varStatus:用来记录循环的状态,常用的属性:
count:记录次数 从1开始
current:当前遍历的内容
index: 索引 从0 开始

  • 格式2:
<c:forEach items="${el获取域中的容器}" var="n">
	${n }
</c:forEach>

代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    int[] ints = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
    request.setAttribute("arr",ints);
%>

<c:forEach begin="1" end="20" step="2" var="i" varStatus="vs">
    ${i}-----${vs.count}------${vs.current}<br>
</c:forEach>

<c:forEach items="${arr}" var="n">
    ${n}<br>
</c:forEach>
</body>
</html>

在这里插入图片描述
小案例:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <meta charset="utf-8">
    <title></title>
</head>
<body>
<table border="6" cellspacing="6"  cellpadding="30" width="500px" height="500px" align="center" bgcolor="burlywood" bordercolor="yellow">
    <tr align="center" height="100px">
        <!-- 调宽没意义,已经固定了 -->
        <!-- 一般来说,th做一个表头,但是用th可以帮你加粗居中 -->
        <th>序号</th>
        <th></th>
        <th></th>
        <th>部门编号</th>
    </tr>

    <c:forEach begin="0" end="5" step="1" var="i" varStatus="vs">
        <tr align="center" bgcolor="aquamarine">
            <td>${list[i].emp_no}</td>
            <td>${list[i].emp_fname}</td>
            <td>${list[i].emp_lname}</td>
            <td>${list[i].dept_no}</td>
        </tr>
    </c:forEach>
</table>
</body>
</html>

在这里插入图片描述
c:url——自动补项目路径

<%
	HttpServletRequest req = (HttpServletRequest)(pageContext.getRequest());
	String contextPath = req.getContextPath();
	session.setAttribute("aaa", "aaa");
 %>

以下两个路径最终都可以访问到foreach.jsp页面:

<%=contextPath %><br>
${pageContext.request.contextPath}<br>
<a href="${pageContext.request.contextPath}/foreach.jsp">foreach.jsp</a><br>
<a href='<c:url value="/foreach.jsp" />'>foreach.jsp</a>

c:set——保存数据(保存到域中)默认保存到page域
c:out——从域中取出数据

<%--使用标签 --%>
<%--set标签 : --%>
<c:set var="name" value="rose" scope="request"></c:set>
<%
    String msg = null;
    pageContext.setAttribute("msg",msg);
%>
    
${msg }<br/>
<%--out标签: 获取数据(从域中) 
default: 当value值为null时,使用默认值
escapeXml: 是否对value值进行转义,false,不转义,true,转义(默认)
--%>
<c:out value="${msg}" default="<h3>标题3</h3>" escapeXml="true">
</c:out>

c:choose——多条件判断

 <%--choose标签+when标签+otherwirse标签: 多条件判断 --%>
    <c:set var="score" value="56"></c:set>
    
    <c:choose>
    	<c:when test="${score>=90 && score<=100}">
    		优秀
    	</c:when>
    	<c:when test="${score>=80 && score<90}">
    		良好
    	</c:when>
    	<c:when test="${score>=70 && score<80}">
    		一般
    	</c:when>
    	<c:when test="${score>=60 && score<70}">
    		及格
    	</c:when>
    	<c:otherwise>
    		不及格
    	</c:otherwise>
    </c:choose>

c:forTokens——循环特殊字符串

<%-- forToken标签: 循环特殊字符串 --%>
<%
	String str = "java-php-net-平面";
	pageContext.setAttribute("str",str);
 %>

<c:forTokens items="${str}" delims="-" var="s">
	${s }<br/>
</c:forTokens>

c:redrict——重定向

<%--redrict:重定向 --%>
<c:redirect url="http://www.baidu.com"></c:redirect>

6、MVC开发模式

在这里插入图片描述

  • MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controller)
  • MVC可对程序的后期维护和扩展提供了方便,并且使程序某些部分的重用提供了方便。而且MVC也使程序简化,更加直观。

控制器Controller:对请求进行处理,负责请求转发; ——servlet
视图View:界面设计人员进行图形界面设计;——JSP
模型Model:程序编写程序应用的功能(实现算法等等)、数据库管理;Java对象;用于处理管理数据库、处理业务逻辑、封装实体数据;——JDBC

【注意】:MVC不是Java的东西,几乎现在所有B/S结构的软件都采用了MVC设计模式。但是要注意,MVC在B/S结构软件并没有完全实现,例如在我们今后的B/S软件中并不会有事件驱动 !

JavaWeb与MVC

JavaWeb的经历了JSP Model1、JSP Model1二代、JSP Model2三个时期。

  • JSP Model1第一代

JSP Model1是JavaWeb早期的模型,它适合小型Web项目,开发成本低;Model1第一代时期,服务器端只有JSP页面,所有的操作都在JSP页面中,连访问数据库的API也在JSP页面中完成。也就是说,所有的东西都耦合在一起,对后期的维护和扩展极为不利。

在这里插入图片描述

  • JSP Model1第二代

JSP Model1第二代有所改进,把业务逻辑的内容放到了JavaBean中,而JSP页面负责显示以及请求调度的工作。虽然第二代比第一代好了些,但还让JSP做了过多的工作,JSP中把视图工作和请求调度(控制器)的工作耦合在一起了。

在这里插入图片描述

  • JSP Model2

JSP Model2模式已经可以清晰的看到MVC完整的结构了。

在这里插入图片描述

1、JSP:视图层,用来与用户打交道。负责接收用来的数据,以及显示数据给用户;
2、Servlet:控制层,负责找到合适的模型对象来处理业务逻辑,转发到合适的视图;
3、JavaBean:模型层,完成具体的业务工作,例如:开启、转账等。

JSP Model2适合多人合作开发大型的Web项目,各司其职,互不干涉,有利于开发中的分工,有利于组件的重用。但是,Web项目的开发难度加大,同时对开发人员的技术要求也提高了。

JavaWeb经典三层架构

我们常说的三层框架是由JavaWeb提出的,也就是说这是JavaWeb独有的! 所谓三层是表述层(WEB层)、业务逻辑层(Business Logic),以及数据访问层(Data Access)。

1、WEB层:包含JSP和Servlet等与WEB相关的内容;
2、业务层:业务层中不包含JavaWeb API,它只关心业务逻辑;
3、数据层:封装了对数据库的访问细节;

注意,在业务层中不能出现JavaWeb API,例如request、response等。也就是说,业务层代码是可重用的,甚至可以应用到非Web环境中。业务层的每个方法可以理解成一个功能,例如转账业务方法。业务层依赖数据层,而Web层依赖业务层!

在这里插入图片描述

7、单元测试

java单元测试JUnit框架原理与用法实例教程

  • JUnit是一个Java语言的单元测试框架,有它自己的JUnit扩展生态圈,多数Java的开发环境都已经集成了JUnit作为单元测试的工具。

  • 注解@Test:该注释表示,用其附着的公共无效方法(即用public修饰的void类型的方法 )可以作为一个测试用例;

import org.junit.Test;
public class MyTest {
    @Test
    public void test(){
        System.out.println("这不是主方法,而是一个测试方法!");
    }
}

在这里插入图片描述

IDEA内置了这个注解的jar包,我们只需要纠错导入它就好了;

本课程详细讲解了以下内容:     1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程     2.使用Eclipse快速开发JSP、编码问题、JSP页面元素以及request对象、使用request对象实现注册示例     3.请求方式的编码问题、response、请求转发和重定向、cookie、session执行机制、session共享问题      4.session与cookie问题及application、cookie补充说明及四种范围对象作用域      5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别      6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据      7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)      8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析      9.MVC案例、三层架构详解、乱码问题以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)     1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)      11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet      12.文件上传及注意问题、控制文件上传类型和大小、下载、各浏览器下载乱码问题      13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove      14.过滤器、过滤器通配符、过滤器链、监听器      15.session绑定解绑、钝化活化      16.以及Ajax的各种应用      17. Idea环境下的Java Web开发
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页