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'>\n"+"<H1 align=center>" +title+"</H1>\n"+"<table border=1 align=center>\n" +"<tr bgcolor=\"#FFAD00\">\n" +"<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+"\n<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>\n</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'>\n"+"<H1 align=center>" +title+"</H1>\n"+"<table border=1 align=center>\n" +"<tr bgcolor=\"#FFAD00\">\n" +"<th>paramater name<TH>parameter Value(s)"); Enumeration paramNames=req.getParameterNames(); while(paramNames.hasMoreElements()){ String paramName=(String) paramNames.nextElement(); out.println("<TR><TD>"+paramName+"\n<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>\n</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
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);