JSP--JSP简介及原理;3个指令;6个动作;9个对象

一、JSP概述

jsp其实就是servlet。

二、JSP原理

查看jsp翻译生成的java文件的源码也可知,间接继承了HttpServlet

三、JSP最佳实践以及request和session的区别

案例:实现一个登录界面,如果用户名以及密码正确跳到success.jsp,否则带回在login.jsp显示用户名或密码错误。

jsp的最佳实践:

jsp:展示用户数据
servlet:重点编写java逻辑(接收表单数据、处理业务逻辑、分发转向
代码:
login.jsp

<% String msg  = (String) request.getAttribute("msg");
    if (msg!=null){
        out.print(msg);
    }
    %>
<form action="/Login" method="post"/>
    用户名:<input type="text" name="userName"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    <input type="submit" value="提交">
    </form>

LoginServlet.java

 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        处理表单数据
        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");
        req.getSession().setAttribute("name",userName);
//        处理业务逻辑
        if("tom".equalsIgnoreCase(userName)&&"123".equals(pwd)){
//            分发转向
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }else {
            req.setAttribute("msg","您的用户名或者密码输入错误");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }

success.jsp

<body>
欢迎您:
<%
    String name = request.getParameter("userName");
    out.print(name);
%>
</body>

request和session的区别
首次从login.jsp填写用户名密码=》跳转到LoginServlet,sevlet进行处理,如果成功转发到success.jsp,否则转发到login.jsp
以上都是一次请求
问题:
如果想到了success.jsp页面以后,想通过一个超链接跳转回首页,并且在首页显示用户名,但这就是两次请求了,怎么办,?
答:在LoginServlet中getSession.setAtrribute(),创建一次session,就可以在login.jsp中拿到session.getAttribute()
记住,getAttribute()得到的是一个对象,要强转成string
代码:

LoginServlet.java
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        处理表单数据
        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");
       req.getSession().setAttribute("name",userName);
//        处理业务逻辑
        if("tom".equalsIgnoreCase(userName)&&"123".equals(pwd)){
//            分发转向
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }else {
            req.setAttribute("msg","您的用户名或者密码输入错误");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
        }
    }

login.jsp

<body>
    <% String msg  = (String) request.getAttribute("msg");
    if (msg!=null){
        out.print(msg);
    }
    %>
<form action="/Login" method="post"/>
    用户名:<input type="text" name="userName"/><br/>
    密码:<input type="password" name="pwd"/><br/>
    <input type="submit" value="提交">
    </form>
<%
    String name = (String)session.getAttribute("name");
    if (name!=null) {
        out.print(name);
    }
%>
</body>

四、JSP

4.1 jsp的基本语法

4.1.1、小脚本 <% java代码 %>
4.1.2、表达式 <%= 2+3 %> 等价于out.print(2+3);
4.1.3、JSP注释
JSP注释:<%– 被注释的内容 –%> 特点:安全,省流量
网页注释:< !– 网页注释 –> 特点:不安全,费流量

4.2 jsp的三个指令

JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
page
include
taglib 标签指令

语法:
<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2”。。。%>

4.2.1 Page

1.1、 isErrorPage: 是否创建throwable对象。默认是false;
1.2、 contextType: 等同于response.setContextType(“text/html;charset=utf-8”);
1.3、 pageEncoding: 告诉JSP引擎要翻译的文件使用的编码。
1.4、 isELIgnored: 是否支持EL表达式。 默认是false

pageEncoding和contexType的编码问题:
编码的解析

4.2.2 Include指令

静态包含:把其它资源包含到当前页面中。
<%@ include file=”/header.jsp” %>
动态包含:
< jsp : include page=”/header.jsp”>

两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。

原则:能用静的就不用动的。

4.2.3 Taglib指令

作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>

4.3 jsp的6个动作

< jsp : include >
< jsp:include > 动态包含

下面两个可以结合使用
< jsp:forward> 请求转发
< jsp:param> 设置请求参数

< jsp : useBean>
< jsp : setProperty> 给指定的对象属性赋值
< jsp : getProperty >取出指定对象的属性值
案例代码:
1.jsp

<body>
    <%
        Student student = new Student();
        student.setName("tom");
        out.print(student.getName());
    %>
    //下面的与上面效果相同
    <jsp:useBean class="com.jsp.action.Student" id="stu1"></jsp:useBean>
    //set方法
    <jsp:setProperty name="stu1" property="name" value="jerry"/>
    //get方法
    <jsp:getProperty name="stu1" property="name"/>
</body>

4.4 jsp的九大内置对象

指在JSP的<%=%> 和<% %>中可以直接使用的对象
这里写图片描述

4.5 pageContext(重要)

本身也是一个域对象:它可以操作其它三个域对象(request session application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE

代码案例:
pageContext.java

<body>
    <%
            pageContext.setAttribute("p","pp");
            request.getRequestDispatcher("/pageContext1.jsp").forward(request,response);
            //pageContext可以操作其他三大域对象
           pageContext.setAttribute("p","request",PageContext.REQUEST_SCOPE);
           //等同于 req.setAttribute 其他session application 类似

    %>
</body>

pageContext1.java

<body>
    <%=pageContext.getAttribute("p")%>//取不到值,只能取到当前页面的值
</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值