Servlet是java早期的靠java语言编写的Web服务器端技术,可以实现前后端的交互,Servlet对每个请求都是单独启动一个线程。
Servlet的实现(工具例如eclipse以及服务器Tomcat)
准备工作
1.导入Tomcat服务器
2.创建dynamic web project设置版本为2.5
3.把project添加入服务器
新建Servlet
1、src中新建包以及普通Java类
2、继承HttpServlet类/实现Servlet接口/继承GenericServlet类
3、重写service方法
4、设置web.xml配置文件
eg.在class文件中继承实现类(extends,implements)↓
1.public class Servlet01 extends HttpServlet {
@Override
protected void service(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException {
System.out.println("Hello Servlet!");
}
}
2.public class Servlet02 implements Servlet {
/**
* 系统方法,servlet销毁时执行,关闭服务器销毁(只会执行一次)
*/
@Override
public void destroy() {
System.out.println("Servlet02 destroy...");
}
@Override
public void init(ServletConfig arg0) throws ServletException {
System.out.println("Servlet02 init...");
}
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
System.out.println("Servlet02...");
}
}
3.public class Servlet03 extends GenericServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
System.out.println("Servlet03...");
}
}
在web-INF中的web.xml配置对应java文件
在</welcome-file-list>标签后以及</web-app>标签前配置
eg.
<servlet>
<servlet-name>Servlet01</servlet-name>
// 给服务器看,servlet的名称,要与 servlet-mapping 标签中的 servlet-name保持一致
<servlet-class>com.shsxt.servlet.Servlet01</servlet-class>
//Servlet类的路径(有包名要加包名,按住"ctrl"键能点进去)
</servlet>
<servlet-mapping>
<servlet-name>Servlet01</servlet-name>
//给浏览器看,servlet的名称,要与 servlet 标签中的 servlet-name保持一致
<url-pattern>/ser01</url-pattern>
<!-- servlet的对外访问路径 -->
</servlet-mapping>
-------------------------------
<servlet>
<servlet-name>Servlet02</servlet-name>
<servlet-class>com.shsxt.servlet.Servlet02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet02</servlet-name>
<url-pattern>/ser02</url-pattern>
</servlet-mapping>
-----------------------------
<servlet>
<servlet-name>Servlet03</servlet-name>
<servlet-class>com.shsxt.servlet.Servlet03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Servlet03</servlet-name>
<url-pattern>/ser03</url-pattern>
</servlet-mapping>
<servlet>
继承HttpServlet后的一些功能
refresh(自动刷新或跳转)
eg.跳转,3秒后跳转到百度
resp.setHeader("refresh", "3;http://www.baidu.com");
- getWriter()获取字符流(只能响应,回字符)
resp.getWriter().write("Hello");
resp.getWriter().write("<input type='text' value='123' />");
- getOutputStream()获取字节流(能响应一切数据)。
resp.getOutputStream().write("<h2>Hello2</h2>".getBytes());
响应回的数据到客户端被浏览器解析。
注意:两者不能同时使用。
setContentType() 设置数据的响应类型
-
响应乱码问题
乱码原因:
服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则出现乱码。
注:如果服务端和客户端编码一致,但编码不支持中文,也会乱码。 -
乱码情况:
getWriter()的字符乱码
对于 getWriter()获取到的字符流,响应中文必定出乱码,由于服务器端在进行编码时默认会使用 ISO-8859-1 格式的编码,该编码方式并不支持中文。
设置服务端的编码
resp.setCharacterEncoding(“UTF-8”);getOutputStream()字节乱码
对于 getOutputStream()方式获取到的字节流,响应中文时,由于本身就是传输的字节, 所以此时可能出现乱码,也可能正确显示。 -
解决方案:
同时设置服务端和客户端的编码及响应类型
resp.setContentType(“text/html;charset=UTF-8”); -
总结:
要想解决响应的乱码,只需要保证使用支持中文的编码格式。并且保证服务器端 和客户端使用相同的编码方式即可。
setContentType() 设置数据的响应类型及编码
重定向
- 重定向是一种服务器指导,客户端的行为。户端发出第一个请求,被服务器接收,经过处理服务器进行响应,与此同时,服务器给客户端一个地址(下次请求的地址 resp.sendRedirect(“url”);)
请求转发和重定向区别
- 请求转发
req.getRequestDispatcher("url).forward(req, resp);
req.getRequestDispatcher("http://www.baidu.com").forward(req, resp);
1、地址栏不发生改变
2、服务端跳转
3、只有一次请求
4、request作用域共享 (一次请求中有效)
5、跳转的地址定位到站点名后 (请求转发到当前项目的资源路径)
- 重定向
resp.sendRedirect("http://www.baidu.com"); resp.sendRedirect("url");
1、地址栏发生改变
2、客户端跳转
3、存在两次请求
4、request作用域不共享
5、跳转的地址定位到http (可以重重定向到任意地址)
路径问题
- 相对路径
相对于当前资源的路径 - 绝对路径
资源的完整路径 - 完整绝对路径
以 http://开头的,该种绝对路径已经跨域,即任何地方的资源都能访问 - 部分绝对路径
以"/"开头,从当前域名|IP|主机后的端口号开始的,不能跨域