Servlet
开发动态web资源的技术,采用单例设计模式.其实就是一个可以向浏览器输出数据或者接收用户的请求数据的java类。
一、使用Servlet
编写一个类,实现Servlet接口或继承实现类(GenericServlet、HttpServlet)
部署到web服务器中
二、tomcat对java工程要求的目录结构
工程名
|
|-- 静态web资源 ——>外界可直接访问
|-- WEB-INF ——>外界无法非法直接访问,由服务器调用
|--classes ——>存储所有的class文件
|--lib ——>需要使用的jar包
|--web.xml ——>servlet的配置信息
<web-app>
<servlet>
<servlet-name>别名</servlet-name>
<servlet-class>完整类名</servlet-class>
<init-param>
<param-name>键</param-name>
<param-value>值</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>别名</servlet-name>
<url-pattern>URL路径</erl-pattern>
</servlet-mapping>
</web-app>
三、生命周期
- init ——>初始化工作,比如读取配置文件,有且只有调用一次(单例模式)
- service——>处理用户请求
- destroy——>清理资源,移除时调用
四、运行原理
- 通过URI定位,与web.xml匹配获取全类名
- 用反射创建servlet对象并调用init方法
- 创建request对象封装用户的请求
- 创建response对象并调用service方法处理用户请求
五、映射问题
一个Servlet可以映射多个url路径的
- 方式一:配置多个
servlet-mapping
- 方式二:配置多个
url-pattern
- 方式一:配置多个
servlet-name
和servlet-class
的绑定要在servlet-mapping
前映射路径的通配符(固定)
- 路径匹配:”/”开头,”/*”结尾
- 文件扩展名匹配:”*.扩展名”
- 注意:
- ”*”在中间是普通字符,而非通配符
- 映射冲突时,”/”开头的优先级>”*”开头的优先级>默认映射
- 配置缺省Servle
<url-pattern>/</url-pattern>
时,如果根路径中有静态页面(非jsp)是访问不到的,为什么?
六、HttpRequest对象
代表了客户端的请求,HTTP请求的所有信息都被封装到这个对象
获取客户端的信息
request.getMethod();//获取请求方式 request.getRequestURI();//获取请求的资源 request.getProtocol();//获取请求的协议 request.getHeaderNames();//获取所有请求头,返回Enumeration
获取请求参数
request.getParameter(name); //获取单值的请求参数 request.getParameterValues(name); // 获取多值的请求参数 request.setCharacterEncoding("UTF-8"); //通知Request对象获取实体内容时用UTF-8 new String(getBytes("iso8859-1"),"utf-8");//解决URI参数乱码问题
作为域对象传递数据
域对象:可以存储数据,也可以把数据传递给其他Servlet.//Servlet1 request.setAttribute(name,value);//添加数据 request.getRequestDispatcher("/Servlet2").forward(request,response);//请求转发,共享请求数据 //Servlet2 request.getAttribute(name);//获取数据 request.removeAttribute(name);//移除共享
请求重定向和请求转发
- 请求重定向
- 原理:由浏览器发出新的请求,新建Request对象
- 浏览器地址栏改变
- 是request的方法
- 请求转发
- 原理:由服务器发出请求,浏览器不知道,不新建Request对象
- 浏览器地址栏不变
- 只能转发到同一个WEB应用的组件
- 是response的方法
- 注意:URI中的”/”在服务器代表工程的根,在浏览器代表主机
- 请求重定向
response.sendRedirect("/day08/message.jsp");//请求重定向
request.getRequestDispatcher("/message.jsp").forward(request, response);//请求转发
七、HttpResponse对象
主要功能是向浏览器输出数据和通知浏览器处理一些信息。(见HTTP的笔记)
八、ServletContext
- 由Tomcat启动时为各个工程创建一个ServletContext对象,代表整个WEB工程
获取当前应用路径
getServletContext().getContextPath();
向浏览器输入信息
getWrite()
解决硬编码问题
在web.xml配置<context-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </context-param>
然后再
String charset= getServletContext().getInitParameter("charset"); request.setContentType("text/html;charset="+charset); response.setCharacterEncoding(charset);
作为域对象使用
存放的数据可以供工程内的所有Servlet使用,具体使用跟其他域对象(比如上文的request)差不多。
获取文件资源
InputStream in = getServletContext().getResourceAsStream(uri); String root = getServletContext().getRealPath(uri);
九、Servlet的缺点
- 所有HTML标签都要包在Java字符串中,难以排版
- 所有的文本和HTML标签都要进行硬编码,修改需要重新编译