当前位置: 代码迷 >> Web前端 >> Servlet札记
  详细解决方案

Servlet札记

热度:395   发布时间:2012-09-04 14:19:30.0
Servlet笔记

1.Servlet是服务器小应用程序,用来完成B/S架构下客户端请求的响应处理,平台独立性能优良一般需要在容器中运行,容器一般选择Tomcat,Servlet API为Servlet提供了统一的编程接口。
2.Web Application的概念,必须要有WEB-INF文件夹,文件夹下要有web.xml(该web app的配置文件)、lib(该web app用到的库文件)、classed(存放编译好的servlet)和META-INF文件夹,存放该web app的context,符合J2EE标准。静态页面要放在WEB-INF外面,javax.servlet是一般的包,没有考虑到具体的协议,所以一般用具体的包。比如,继承javax.servlet.http这个子包里面的类。servlet只是一个接口,没有定义具体的类。
3.doget()方法,不是你自己写程序调用,而是Tomcat在程序需要调用的时候帮助调用的。PrintWriter自动flush,不抛异常。Tomcat的好处在于他帮助你处理Socket相关的东西,不需要你自己写Socket,而只写其他的东西。写完程序之后,没有main方法等,没法运行,所以需要部署到Tomcat里面。servlet里面有service方法,tomcat会在适当的时候帮忙调用。
4.HttpServlet类里面的两个service方法,其中一个是从接口带来的service,它会把相关的请求分发到另一个受保护的service方法,这个是添加的service方法,而且这个service则调用响应的doPost、doGet方法。理论上讲,只要重写此service方法,也可实现直接doPost、doGet方法。另:只要以/开头的都叫绝对路径,不以/开头的叫相对路径。
5.tomcat的地址栏是区分大小写的。如果配置的时候class不是一个裸体类,而是有包的话,那么在web.xml里面配置的时候就要在class里面写上包。
6.servlet的生命周期:在服务器内部,只有一个servlet的对象,加载classLoader,客户端第一次访问,实例化new,初始化init(),以多线程的方式处理请求service doGet doPost,退出服务destroy(),在reloading之后会执行destroy().以上都是tomcat帮忙完成的。init()只执行一次,第一次初始化的时候执行。关于多线程的情况是,tomcat内部会有一个线程池,提前准备很多线程,当一个客户端的请求过来之后,分配一个线程。这些线程访问的都是同一个对象。destroy方法在退出服务的时候调用。
7.为什么有两个GenericServlet有两个init(),其中一个init里面有一个this.init(),这是为防止程序员重写init方法时忘了调用super.init(),所以另外多出一个内部什么都没写的init(),从而建议程序员在重写init()的时候调用这个init().
8.解决乱码问题。set方式:response.setContentType("text/html;charset=GBK"),request.setCharacterEncoding("GBK");.get方式是:在server.xml里面80端口的那个标签加URIEncoding="GBK".如何从上一个页面取得参数?

表单代码:

<form id="form1" name="form1" method="post" action="ThreeParams">
? <table width="343" border="1">
??? <tr>
????? <td width="92">param1</td>
????? <td width="94"><input name="param1" type="text" id="param1" />????? </td>
??? </tr>
??? <tr>
????? <td>param2</td>
????? <td><label>
??????? <input name="param2" type="text" id="param2" />
????? </label></td>
??? </tr>
??? <tr>
????? <td>param3</td>
????? <td><input name="param3" type="text" id="param3" /></td>
??? </tr>
??? <tr>
????? <td>&nbsp;</td>
????? <td><label>
??????? <input type="submit" value="提交" />
????? </label></td>
??? </tr>
? </table>
? </form>
java代码:

import java.io.IOException;
import java.io.PrintWriter;

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


public class ThreeParams extends HttpServlet {

??? @Override
??? protected void doGet(HttpServletRequest req, HttpServletResponse resp)
??? ??? ??? throws ServletException, IOException {
??? ??? PrintWriter out = resp.getWriter();
??? ??? out.println(req.getParameter("param1"));
??? ??? out.println(req.getParameter("param2"));
??? ??? out.println(req.getParameter("param3"));
??? ??? out.flush();
??? ??? out.close();
??? }

??? @Override
??? protected void doPost(HttpServletRequest req, HttpServletResponse resp)
??? ??? ??? throws ServletException, IOException {
??? ??? doGet(req, resp);
??? }

}
具体的过程就是从表单请求中获得表单中的三个参数,然后依次打印。另外,表单中的post方法和get方法的区别就是get方法是将数据附加在url上传递过来,所以能够传递的数据有限;而post方法是将数据按照块的方式传递过来。

  相关解决方案