Servlet常见问题

selvlet 是运行在web服务器上的程序 是流浪其或http客户端的请求和服务器上的数据库或应用程序之间的中间层
cgi公共网关接口效果差不多 selvlet区别是 性能更见好 独立于平台 在web服务器的地址空间执行 没有再创建单独的进程处理客户端请求

说出Servlet的创建方式
第一种实现servlet的接口 重写里面的方法

  public class ServletDemo1 implements Servlet {
 //public ServletDemo1(){} 
 //生命周期方法:当Servlet第一次被创建对象时执行该方法,该方法在整个生命周期中只执行一次
  public void init(ServletConfig arg0) throws ServletException { 	    
           System.out.println("=======init========="); 
      } 
  //生命周期方法:对客户端响应的方法,该方法会被执行多次,每次请求该servlet都会执行该方法
   public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
          System.out.println("hehe");
     } 
    
     //生命周期方法:当Servlet被销毁时执行该方法
public void destroy() { 
        System.out.println("******destroy**********");
     } 
      //当停止tomcat时也就销毁的servlet。 
public ServletConfig getServletConfig() { return null; } 
public String getServletInfo() { return null; } }

第二种 继承GernicServlet重写里面的service方法

public class ServletDemo2 extends GenericServlet { 
@Override 
      public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException { 
        System.out.println("heihei"); 
}
 }

第三种继承httpservlet方法 实现doget dopost

public class ServletDemo3 extends HttpServlet { 
@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
           System.out.println("haha");
 } 
 @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
           System.out.println("ee"); doGet(req,resp); 
  } 
}

说出Servlet的生命周期,并说出Servlet和CGI的区别。

Servlet被服务器实例化后,容器运行其init方法,请求到达时运行其service方法,service方法自动
派遣运行与请求对应的doXXX方法(doGet,doPost)等,当服务器决定将实例销毁的时候调用其destroy方法。
与cgi的区别在于servlet处于服务器进程中,它通过多线程方式运行其service方法,一个实例可以服
务于多个请求,并且其实例一般不会销毁,而CGI对每个请求都产生新的进程,服务完成后就销毁,所以效率上低于servlet。

jsp和servlet之间的相互传值

servlet向jsp

第一种 利用request这个对象在Servlet中设置键值对,在jsp页面通过键获取值,

request.setAttribute("key", value);

key代表键,是一个字符串,jsp页面通过这个字符串可以获取值,注意key一定要一致

    <%
    String s =(String)request.getAttribute( "key ");
    %>

注意通过request获取到的值是Object类型的需要强转,还有就是用这种方法不能用重定向到jsp页面,要用转发

request.getRequestDispatcher("/…….jsp").forward(request, response);

第二种
利用跳转Servlet:

response.sendRedirect("/…….jsp?username="+username);

jsp页面:

<%
        String s = (String) request.getParameter("username");
    %>

jsp向servlet

第一种

通过超链接传值,jsp页面:

<a href="AServlet?password=传输内容">文本</a>

Servlet代码:

String d = request.getParameter("password");

第二种

通过form表单传值:

jsp页面:

<form action="LoginServlet">
    <input type="text" name="username">
    <input type="text" name="password">
    <input type="submit" value="登录">
</form>

Servlet代码:

        String username = request.getParameter("username");
        String password = request.getParameter("password");

servlet之间

通过session对象,一个浏览器就是一个会话,使用两个浏览器无法获得值

        HttpSession session = request.getSession();
        session.setAttribute("user", user);

先获取session对象在把值通过键值对传输

        HttpSession session = request.getSession();
        User user = (User) session.getAttribute("user");

二、

直接跳转,和Servlet向jsp页面传值一样在跳转文件后面添加值

response.sendRedirect("BServlet?username=qu");

接收:

request.getParameter("username");

jsp向jsp传值:

传输:

<%
request.setAttribute("username","username");
%>
<jsp:forward page="demo2.jsp"/>

接收:

<%
String username = (String)request.getAttribute("username");

servlet处理表单

 Enumeration paramNames = request.getParameterNames();
     while(paramNames.hasMoreElements()) {
            String paramName = (String)paramNames.nextElement();
            String[] paramValues =
            request.getParameterValues(paramName);
            if (paramValues.length == 1) {
            String paramValue = paramValues[0];
            if (paramValue.length() == 0)
                out.println("<td><i>没有值</i></td>");
            else
                out.println("<td>" + paramValue + "</td>");
        } else {
            // 读取多个值的数据
            out.println("<td><ul>");
            for(int i=0; i < paramValues.length; i++) {
            out.println("<li>" + paramValues[i]);
        }
            out.println("</ul></td>");
        }
        out.print("</tr>");
    }
    out.println("\n</table>\n</body></html>");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值