jsp、域、js获取数据

300 阅读1分钟

js获取数据的方式

第一种方式是request.getParameter("key");

如下代码:

<%
    String s=(String)request.getAttribute("name");//可以传递任何数据过来,所以类型强制转换
    out.print(s);
%>

结果是:

因为还没有传输,所以是null。

但是如果我把数据是写在后端的request作用域里边的:

后端代码:

req.getRequestDispatcher..这个是跳转到某个jsp页面,把req是指request,resp是值response变量都传过去。

数据是写在了request域里边,那么在demo.jsp中用request.getAttribute就可以直接进行获取了。

那么前端就能够直接获取到,刷新就是如下:

获取到这个值后在js中的使用:

如下代码:

<%
    String s=(String)request.getAttribute("name");//可以传递任何数据过来,所以类型强制转换
    out.print(s);
%>
<script>
    var a="<%=s%>";
    alert(a);
</script>

el和jstl表达式

直接使用jsp太麻烦了,可以使用el表达式:

使用el表达式之前需要现在jsp页面的头部写上如下代码,表示启动el表达式。

如:

开启后,用el表达式就不要上述那一堆代码了,直接在body里边写${key}

如下代码:

<hr>
${name}

结果:

只有request域才能够直接写key,如果是其他的域则需要写上{key},如果是其他的域则需要写上{域.key}的方式。

例如session域

后端代码是把值保存到域里:

        //session作用域
        HttpSession session=req.getSession();
        session.setAttribute("sessionKey","I am session'value");

前端能使用代码如下:

<br>------session域--------<br>
${sessionScope.sessionKey}  

sessionScope指的是session域。是jsp的隐藏全局变量,直接用就可以的。

结果:

其他域里边的数据也是一样的,以上述类推。

js中使用el表达式

其实和jsp的页面使用是一样的,直接用就可以的。只是一定要加"",否则会报错,无法识别内容。

输出结果是:

jstl的使用:

jstl是在el的基础上进行的锦上添花的操作。

jstl使用的话,也是需要进行启动的,在页头顶部加上如下代码:

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

这个注意的是 prefix="c"。

但是uri的路径会报错,所以需要后端安装依赖,就可以解决:

    <!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl -->
    <dependency>
      <groupId>org.glassfish.web</groupId>
      <artifactId>jstl-impl</artifactId>
      <version>1.2</version>
    </dependency>

jstl表达式以循环为例

后端给request域的数据是,代码如下:

        //后端给的数据是集合
        List list=new ArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        //保存request域
        req.setAttribute("list",list);

前端使用的代码是:

<br>--------jstl的表达式----------<br>
<!-- var是循环中的每个值,items指是要循环的 -->
<c:forEach var="value" items="${list}">
    <h2> ${value} </h2>
</c:forEach>

结果是:

第二种方式是后端以输出数据的方式

以servlet为例说明。还是之前的doServlet,只是把内容改了下,改成了如下。

后台代码:

        //这种输出的是输出内容到页面上,前端要用数据就需要用ajax这样的请求。
        resp.getWriter().print("I am a dog");

如果是接口的方式输出,那么前端要获取的话,就需要js中的ajax或者是其他的请求方式。

以jq为列说明:

如下代码:

<script src="./jq.js"></script>
<script>
    $(function (){
        $.ajax({
            url:"http://localhost:8080/demo5_war/demoServlet",
            success:function(res){
                alert(res);
            }
        });
    });
</script>

结果是:

关于域

有时间再写吧。

遇到的bug

idea没有识别out.print

注意:在这里可能会遇到一个问题是out.print编辑代码软件无法识别的问题。需要在idea中把jdk和tomcat在当前的项目下绑定。

按如图的顺序操作:

第一张图:

第二张图:

第三张图:

最后是选中tomcat后确定就可以。