Servlet学习笔记

1.doGet()在客户端用GET方式访问servlet时调用,访问url地址

doPost()在form表单提交时,且mothod为post方式调用

2.servlet生命周期

constructor->init->doGet->(再次访问)->doGet

综上:一个web 容器只有一个servlet对象,再次访问不会重新构造对象

package cn.xj.servlet;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestLifeCycleServer extends HttpServlet{

    /**
     * @author Admin
     * 服务不停止,TestLifeCycleServer的对象就存在,且只有刚开始一个
     * init()方法只在初始化的时候执行一次
     */
    
    //1.实例化
    public TestLifeCycleServer()
    {
        System.out.println("constructor!");
    }    
    
    
    @Override
    //2.初始化
    //ServletConfig config存储web.xml的servlet配置信息
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println("init");
    }
    
    @Override
    //3.处理service, doGet doPost
    public void destroy() {
        // TODO Auto-generated method stub
        System.out.println("destory");
    }


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doGet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }

}

3.request读取所有参数

getParameterMap()方式:

package cn.xj.servlet;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowParamsMap extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        resp.setContentType("text/html;charset=utf8");
        PrintWriter out=resp.getWriter();
        String title="Reading all request parameters";
        out.println("<html><head><title>读取所有参数</title></head>"
        +"<body BGCOLOR='FDF5E6'>
"+"<H1 align=center>"
        +title+"</H1>
"+"<table border=1 align=center>
"
        +"<tr bgcolor="#FFAD00">
"
        +"<th>paramater name<TH>parameter Value(s)");
        
        Map paramsMap=new HashMap();
        paramsMap =req.getParameterMap();
        Set paramsSet =paramsMap.keySet();
        for(Object obj:paramsSet.toArray()){//依次遍历
            String paramName=obj.toString();//依次获取键值对的Key 即 paramName
            //String paramValue=((String[])paramsMap.get(paramName))[0];
            //System.out.println(paramValue);
            out.println("<TR><TD>"+paramName+"
<TD>");
            //每个paramName对应的value可能多个
            String[] paramValues=(String[]) paramsMap.get(paramName);
            if(paramValues.length==1){//如果就一个就取第一个
                String paramvalue=paramValues[0];
                if(paramValues.length==0){
                    out.println("<I>No Value</I>");
                    }
                else
                    out.println(paramvalue);        
                }else{
                    out.println("<UL>");
                    for(int i=0;i<paramValues.length;i++){//多个的话挨个打印
                        out.println("<LI>"+paramValues[i]);
                    }
                    out.println("</UL>");
                }
            
            }
            out.println("</table>
</body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }

}

getParameterNames(),getParameterValues()方式

package cn.xj.servlet;


import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ShowParams extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        resp.setContentType("text/html;charset=utf8");
        PrintWriter out=resp.getWriter();
        String title="Reading all request parameters";
        out.println("<html><head><title>读取所有参数</title></head>"
        +"<body BGCOLOR='FDF5E6'>
"+"<H1 align=center>"
        +title+"</H1>
"+"<table border=1 align=center>
"
        +"<tr bgcolor="#FFAD00">
"
        +"<th>paramater name<TH>parameter Value(s)");
        Enumeration paramNames=req.getParameterNames();
        while(paramNames.hasMoreElements()){
            String paramName=(String) paramNames.nextElement();
            out.println("<TR><TD>"+paramName+"
<TD>");
            String[] paramValues=req.getParameterValues(paramName);
            if(paramValues.length==1){
                String paramvalue=paramValues[0];
                if(paramValues.length==0){
                    out.println("<I>No Value</I>");
                    }
                else
                    out.println(paramvalue);        
                }else{
                    out.println("<UL>");
                    for(int i=0;i<paramValues.length;i++){
                        out.println("<LI>"+paramValues[i]);
                    }
                    out.println("</UL>");
                }
            }
            out.println("</table>
</body></html>");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }

}

 

cookies:(浏览器端可以禁止cookies,而且以文件的形式保存在本机,不可靠)

一个servlet/jsp设置的cookies能被同一路径下面或者子路径下面的servlet/jsp读取到。(如在url为/servlet/setCookies产生的cookies不能被url为/showCookies的servlet/jsp读取)

路径指的是URL,不是真实的文件路径

session(记录在服务器端,服务器端开辟一块内存用于存session,这块session内存与客户端的浏览器当前子窗口是直接相连的,新开浏览器窗口会开辟新的不同session)

session的两种实现方式:

a.Cookies(如果浏览器支持Cookies,创建Session的时候会把SessionID存入Cookies里)

b.url的重写方式(如果不支持Cookies,必须自己编程使用URL重写的方式实现Session:response.encodeURL(SessionID))

session不像cookies拥有路径访问问题,即同一application下的servlet、jsp可以共享同一个session,前提是同一个客户端窗口(浏览器窗口)

Application(有些值存放在服务器内存中,能让所有客户段都能共享,这些值可以存放在application中----共用的一块服务器内存)

对应ServletContext对象

httpServlet 的getServletContext()方法获取

可以统计访问该application的全部访问量(含不同用户 不同浏览器客户端)

JSP

<%= ++accesscount %>表示将中间的值在网页直接输出出来

<%! int accesscount=0 %>  成员变量,++后的值会累计

<% int accesscount=0 %>   局部变量,++后的值不变

a.下面这种注释在浏览器客户端网页的源文件可以看到

<!--

html注释

-->

b.客户端源文件看不见,写给程序员自己看

<%--

jsp注释内容

--%>

c.同Java一样

<%

//Java注释内容

/*

java注释内容

*/

%>

 

ps:url传递中文或特殊字符,要encode

Directive –include

<%@include  file=”fileURL”%>

在JSP编译前包含进来  ps:不能向fileURL中传递参数 如abc.jsp?user=aaa

Action---运行期间

a.include:<jsp:include page=”URLSpec” flush=”true”/> 可以带参数    注意与上面的include的区别

b.forward 将jsp的内容传送到指定的URL中

例如:可用于传指定参数

<jsp:forward page=”xxxurl”>

<jsp:param name=”paramName” value=”paramValue”/>

</jsp:forward>

ps: forward的页面和forward到的页面用的是同一个request

<jsp:forward>与response.sendRedirect的区别

1.forward使用的是同一个request  而sendRedirect使用的不同的request

forward和sendRedirect区别

c.useBean

Bean类要写在包内,不要写裸体类,必须有一个不带参数的构造函数

<jsp:useBean id=”cb” class=”bean.CounterBean”type=”java.lang.Object”>//id=”cb”相当于new 了个对象,且类型为Object类型

</jsp:useBean>

<jsp:setproperty name=”cb”property=”count” value=”23”/>//相当于 cb.setCount(23)

<jsp:getproperty name=”cb” property=”count”/>//相当于 out.write(cb.getcount())

编码问题

<%

String name =request.gatParameter(“name”);//如果request传递过来的数据打印为乱码,而没有办法去处理乱码问题 可以采用下面通用的原始的办法

out.println(new String(name.getBytes(“ISO8859_1”),”GBK”));//转码,需要认清原来的编码和转码后的编码

%>

常见面试题:JSP中常见的内置对象和常用方法

servlet与jsp之间的通讯

jsp->>servlet:在jsp中,<jsp:forward page=”servlet/ServletToJSP”/>  或者SendRedirect方式

servlet->>jsp:在doGet方法中:

resp.setContextType(“text/html;charset=gb2312”);

req.setAttribute(“ServletName”,”ServletToJSP”);

getServletConfig().getServletContext().getRequestDispatcher(“/Servlet_jsp/ServletUseJsp.jsp”).forward(req,resp);

原文地址:https://www.cnblogs.com/NeilLing/p/4354664.html