servlet学习总结——servlet入门
1、Servlet
1.1 servlet的概述
1.1.1 什么是servlet
● Servlet(Server Applet)是Java Servlet的简称,称为服务器端小程序,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容。
● 狭义的Servlet是指Java语言实现的一个接口
● 广义的Servlet是指任何实现了这个Servlet接口的类,一般情况下,人们将Servlet理解为后者。Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet只用来扩展基于HTTP协议的Web服务器。
1.1.2 使用Servlet
● 编写一个Java类实现Servlet的接口
● 在web.xml中,配置Servlet
1.1.3 编写servlet入门程序
新建web项目

修改发布路径

导包


编写servlet程序
//1.编写一个类实现Servlet接口
//2.我们首先编写一个实现Servlet接口的类,谁来调用?
//3.谁来创建对象,谁来调用 tomcat来创建和调用
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("HelloServlet被调用了...");
response.getWriter().write("Hello Servlet!");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
配置XML文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<!--配置servlet-->
<servlet>
<!--servlet名字-->
<servlet-name>HelloServlet</servlet-name>
<!--servlet的全限定名-->
<servlet-class>com.gxa.servlet.HelloServlet</servlet-class>
</servlet>
<!--配置虚拟路径-->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
1.1.4 总结

Tomcat的访问流程

Tomcat引擎执行的操作
- 接受并解析客户端浏览器的请求 "/day04/hello"
- 创建2个对象 request, response
- 在webapps找访问的资源 "com.gxa.servlet.HelloServlet"
- 反射技术创建类的对象
- 调用对象中的方法 service, 传递参数 request, response
- 数据写在了 reponse对象的缓冲区中
- service方法结束后,数据从response对象的缓冲区取出,组装成HTTP的响应信息, 回传给浏览器
2、ServletContext

3、ServletConfig
ServletConfig对象封装Servlet的相关信息,获取Servlet的名字,可以获取Servlet的初始化参数,获取ServletContext的引用。

4、HttpServlet
有两个service方法,一个方法向下转型,然后传给重写的service
public abstract class HttpServlet extends GenericServlet {
//实现service方法
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
//向下转型
HttpServletRequest request;
HttpServletResponse response;
try {
request = (HttpServletRequest)req;
response = (HttpServletResponse)res;
} catch (ClassCastException var6) {
throw new ServletException(lStrings.getString("http.non_http"));
}
//调用重载的service方法
this.service(request, response);
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取请求的方式,判断调用doGet还是doPost方法
String method = req.getMethod();
long lastModified;
if (method.equals("GET")) {
this.doGet(req, resp);
} else if (method.equals("POST")) {
this.doPost(req, resp);
}
}
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = lStrings.getString("http.method_get_not_supported");
this.sendMethodNotAllowed(req, resp, msg);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String msg = lStrings.getString("http.method_post_not_supported");
this.sendMethodNotAllowed(req, resp, msg);
}
}

5、HttpServletResponse
HttpServletResponse我们可以往里面去设置响应行,响应头,响应体,tomcat解析response对象,封装成http的响应,返回给浏览器。
解决中文乱码问题:
中文乱码有两个点:
// 一个是服务器字符流的编码设置为UTF-8
response.setCharacterEncoding("UTF-8");
// 一个是要告诉浏览器用UTF-8的格式打开
response.setHeader("content-type","text/html; charset=utf-8");
// 或者简写为
response.setContentType("text/html; charset=utf-8");
重定向问题:
告诉浏览器重定向,重定向浏览器的行为,浏览器的地址栏会发生变化
response.setStatus(302);
// 告诉重定向的网址
response.setHeader("location","http://www.baidu.com");
// 封装便捷方式
response.sendRedirect("http://localhost:8080/day05_web/responseServlet03");
6、HttpServletResponse
tomcat把http请求的信息封装到了request对象中,并且把该对象通过service方法传给了我们,我们可以取出请求行,请求头,请求体。
对于get与post请求等不同的请求,若不需要区分可以通过继承HttpServlet再重写Service方法避免代码的重复编写
解决请求乱码(post)
解决post请求乱码 与get请求无关
req.setCharacterEncoding("UTF-8");
转发问题:
转发是服务器内部的行为,一次请求一次响应 浏览器地址没有变化 request域的数据可以传递,同一个request对象
//转发
req.getRequestDispatcher("/requestDemo08").forward(req,resp);
防盗链技术:
referer 请求来源,如果我们通过一个网页的超连接访问某个资源,浏览器会携带一个referer头,告诉服务器请求的来源。
可以根据referer 的值来进行判断是否来自我们希望的地址

浙公网安备 33010602011771号