JavaWeb-JSP

JSP

JSP通用于简化创建产生本文的Servlet,而Servlet更适合发送原生字节到客户端或使用Java源代码完全控制源代码的场合。
JSP适合做有页面的Servlet,Servlet适合做无页面,纯粹的业务处理页面,程序调用,请求转发等。

JSP运行机制:

第一次接收到对某个JSP页面的请求后,首先自动将该JSP页面翻译为Servlet代码。 JSP——> java,该代码在 部署的tomcat服务器上的work文件夹。,在JSP生命周期中,整个翻译和编译步骤只发生一次。
JSP,JSPX。编译——翻译:在第一次收到对某个JSP的页面的请求时发生,

   <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jsp</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>jsp</servlet-name>
        <url-pattern>*.jspx</url-pattern>
    </servlet-mapping>

以上XML配置文件说明:所有以.jsp为扩展名的URL的访问请求都由一个Servlet类 org.apache.jasper.servlet.JspServlet(该类在tomcat的jar包中)负责处理,这个类称为JSP引擎。JSP的部署自动完成。。
1.翻译
在第一次收到对某个JSP的页面的请求时发生,JSP->java

2.编译
在第一次收到对某个JSP的页面的请求时发生,java->class

3.装载阶段
该servlet会反射出其他的servlet?来进行对JSP的servlet装载?

4.实例化阶段:
Web容器创建Servlet实例,该JSP内涵的Servlet在容器上注册。,实例化一个对象

5.初始化阶段:
调用Servlet示例的jspInit()方法,允许JSP页面装在资源,至此servlet对象成为了一个完整的servlet,

6.JSP页面服务阶段,容器创建一个线程来处理访问JSP页面客户的请求,servlet对象的_jspService方法运行。

7.销毁

JSP书写说明:
声明:<%!声明变量(全局变量)%> 定义成类的属性。

Scriplet:<%代码,声明%> 声明出来的变量是局部变量,service()方法里面的变量

脚本表达式(输出变量的值) <%= 变量名 %>,直接输出到网页,可以嵌入html标签,将标签做成字符串形式即可,,但好像没有多大用??一般都是外部写标签,然后把<%=%>嵌入在标签里面,输出数据库查询列表的时候可用 内嵌标签的方式?

注释: <%-- --%>

由于jsp的内容相当于是servlet中的service(req,resp)方法中。,所以我们也可以直接使用req,resp参数来使用相关的方法。

JSP指令

提供整个JSP页面的相关信息,用于JSP页面和容器之间的通信,给容器看的

<%@ directive attribute="value1" attribute2 = "value2" %>
有三种类型的指令
page 为当前页面提供处理指令,配置指令
include,用于把另外一个文件包含在JSP中
taglib指定如何包含和访问自定义标签库;


contentType 向浏览器输出的编码格式和内容类型。
pageEncoding 是指当前文件存盘的编码格式。
设置错误页面
<%@ page isErrorPage="true"%>
错误信息out.print(exception.toString());
其他页面发生错误跳转到错误页面时,这样制定
<%@page errorPage="errorHandler.jsp"%>

<%@include%>这个为静态包裹文件,不能加入动态内容,例如xxServlet?id=xx,或者xxx.jsp?id=xxx;

<jsp:include page="localURl" flush="true">
localURL可以是动态文件flush只能是true;。
两个include的区别在于,它们被调用的事件,jsp:include在请求期间被激活,而include在页面转换期间被激活。
include只有一个Servlet,JSP:include(动作)可以多个

指令包含页面真实代码,动作包含响应代码
指令在编译时,动作在请求时
指令做出的修改必须要重启web服务,动作保存即生效
指令不能再请求去内共享对象,动作支持
指令适合静态,动作适合动态。

jsp标准动作:

<jsp:include page="head.jsp"  flush="true" />

<jsp:include page="head.jsp"  flush="true" />
<jsp:param name="aaa" value="ff"/>
</jsp:include>

jsp:forward动作,将客户端发出的请求,从一个JSP网页转发到另一个JSP网页,相当于servlet中的req.getRequestDispacher(url).forward(req,resp)

JSP隐式对象

request:
response:
pageContext :环境Context(上下文)变量(只针对该JSP(servlet);
session.
application: web应用程序的servletContext;
out: 就是resp.getWriter;

config: servlet相关的ServletConfig对象。
page: 相当于this,指代当前的servlet(jsp);
exception:异常对象

<jsp:useBean id="对象标识符" class="类的地址"/>
<jsp:setProperty name="对象名" property="属性名" value="属性值"/>
First Name: <jsp:getProperty name="对象名" property="属性名"/>

jsp MVC ,JSP+servlet + javaBean;

servlet中需要做的事:*将数据封装在请求(?)里面,然后派发到JSP页面,再由页面从request(作用域)中提取数据
- 1.取页面参数
- 2.进行参数的合法性检测
- 3.调用业务逻辑 (从数据库中取得数据或者操作数据)
- 4.将得到的数据(javaBean)放到作用域中(作用域.setAttribute)
- 5.进行页面的跳转(request.getRequestDispaCher(JSP).forward(req,resp))

EL语法

${expression}
${a+b}${c+d}//表示a+b的值拼接字符串上c+d的值。

[]运算符,跟js中的[]差不多,取得某个对象的某个属性,同样,[]的应用更广;

访问Map及遍历Map
<forEachItems="${Map}" var="item">
<c:outvalue="${item.key}"/>
<c:outvalue="${item.value}"/>
</forEach>

访问MAP
${map名[1]};注意,这个1在EL中默认是long类型,所以在设置map集合的时候,map.put(1L,value); 1是键名 ;
${map[键的值]}取得键对应的值; map.get(key)
${list[i]}取得数组下表map.get(i);
${javaBean[属性名]},调用javaBean里面的get方法;

取得header
${header["accept-language"]}
取得数组
${headerValues["accept-langueage"][0]}

检验一个值是否为null或者空
${empty X},是的话返回true
条件运算
${判断语句?A:B}

关闭jsp页面中的EL运算:
<%@ page isELIgnored="true" %>
在部署描述符中使用
<jsp-config>
<jsp-property-group>
<url-pattern>/noEL.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>

request.getContextPath()/index.jsp
无论index.jsp在什么位置,都路径都直接指向项目根目录下。
后台
List<Map<String,Object>> students = new ArrayList<Map<String,Object>>();   
   Map<String,Object> s1 = new HashMap<String,Object>();
   s1.put("name","jim");
   s1.put("age","15");
   students.add(s1);
   Map<String,Object> s2 = new HashMap<String,Object>();
   s2.put("name","lucy")
   s2.put("age","12");
   students.add(s2);
 ```

<c:forEach var="student" items="$ {students}" >
     <tr>
         <span style="white-space:pre">    </span>
         <td>  <c:out value="$ {student.name}" default="wang"/>
         </td>
         <span style="white-space:pre"> </span>
         <td>
         <c:out value="$ {student.age}" default="wang"/>
         </td>
     </tr>
 </c:forEach>


<%   
List<String> list = new ArrayList<String>();   
list.add("first");   
list.add("second");   
List<String> list2 = new ArrayList<String>();   
list2.add("aaaaaa");   
list2.add("bbbbbb");   
Map<String,List<String>> map = new HashMap();   
map.put("a",list);   
map.put("b",list2);   
request.setAttribute("map",map);   
%>   


通过键获得列表值,并遍历列表



<c:forEach var="item" items="${map['a']}">   
${item }<br>   
</c:forEach><br>   
<c:forEach var="item" items="${map['b']}">   
${item }<br>   
</c:forEach>  
 map中值为列表,直接遍历列表中的每一项



<c:forEach var="item" items="${map}">   
<c:forEach items="${item.value}" var="it">   
${it }<br>   
</c:forEach>   
</c:forEach>  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值