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>");