记一次Servlet中getAttribute的错误.

本文介绍了一个名为ShowUserServlet的Servlet实现,该实现用于从HTTP请求中读取用户ID,并使用AuthService来获取相应的用户实例,然后将用户信息转发到userInfo.jsp页面进行显示。此外,文章还涉及了字符编码设置、请求URL获取、客户端IP地址获取以及Cookies的操作。
package com.ykmimi.order.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.ykmimi.order.entity.Customers;
import com.ykmimi.order.service.AuthService;

/**
 * Servlet implementation class ShowUserServlet
 */
@WebServlet("/ShowUserServlet")
public class ShowUserServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
     * response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        ///// * 字符编码设置
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        /////* requestURL
        StringBuffer requestURL = request.getRequestURL();
        System.out.println(requestURL);
        String clientIP = request.getRemoteHost();
        System.out.println(clientIP);


        /////* 获取cookie
        Cookie[] cs = request.getCookies();
        if(cs.length>0){
            for(Cookie c : cs){
                //获取Cookie的name,key
                String name = c.getName();
                request.setAttribute("name",name);   //在这里,如果设置(name,name) 则会在下面cid获取attribute时出现String转long的异常.所以要明确key值必须是""String类型
                String value = c.getValue();
                request.setAttribute("value",value);
            }
        }


        ///// * 获取/login传送过来的long类型值 cid (customer_id)
        long cid = 0;
        cid  = (long)request.getAttribute("cid");
        System.out.println(cid);
//        cid =Long.parseLong(cidStr);
        /////* 获取用户id后进行判定,如果不为0的话,将其再进行查询,返回用户的整个实例,再次进行传值
        /////* 并在最终用户登陆后的显示界面上显示用户信息及登陆后的服务信息.
        if (cid > 0) {
            AuthService as = new AuthService();
            /////* 如果这个id比较符合id的规则 即 大于 0, 那么用它去数据库检索这个id的归属者的实例
            Customers customer = null;
            customer = as.getCustomersInstanceByID(cid);
            request.setAttribute("customerInstance", customer);
            RequestDispatcher rd = request.getRequestDispatcher("/userInfo.jsp");
            rd.forward(request, response);


//            response.sendRedirect("/userInfo.jsp?cid="+cid+"&cname="+customer.getCustomer_name());
        } else if (cid == 0) {
            RequestDispatcher rd = request.getRequestDispatcher("/error.jsp");
            rd.forward(request, response);
        }

    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
     * response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

而且在前一个页面,也就是写入Cookie的Servlet转发过来后,cid是在写如Cookie前的那一个Servlet转发过来的,而写Cookie的那个Servlet不用再重复设置setAttribute("cid",cid)

但如果你在中间转发的那个Servlet又设置"cid"为别的值,那么最后接受时也会改为别的值.

转载于:https://www.cnblogs.com/ukzq/p/9346606.html

类型 异常报告 消息 在 [68] 行处理 [/网页计数器.jsp] 时发生异常 描述 服务器遇到一个意外的情况,阻止它完成请求。 例外情况 org.apache.jasper.JasperException: 在 [68] 行处理 [/网页计数器.jsp] 时发生异常 65: </form> 66: 67: <%-- 网站访问计数器 --%> 68: <h4>访问人数:<%= numberToImage(((BigInteger)application.getAttribute("visitCount")).intValue()) %></h4> 69: 70: <%-- 显示公共留言 --%> 71: <div style="border:1px solid #ccc; padding:10px; margin-top:20px;"> Stacktrace: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:610) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) 根本原因。 java.lang.NullPointerException org.apache.jsp.网页计数器_jsp._jspService(网页计数器_jsp.java:203) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:67) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:466) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:376) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:324) javax.servlet.http.HttpServlet.service(HttpServlet.java:623) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ):注意 主要问题的全部 stack 信息可以在 server logs 查看 代码运行时出现上述错误修改代码
最新发布
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值