目录
4.HttpServletRequest接口(request)
5.HttpServletResponse接口(response)
1、servlet类的创建(不使用注解)
1.创建普通类,继承HttpServlet类,重写doGet和doPost方法
/*以前我们定义的所有的类、方法,都是需要自己来创建对象,对象来调用方法
现在用了web容器,编写的类比如MyServlet 由容器来创建对象的。
容器拿着对象再去调用doGet ,doPost方法
比如请求 http://localhost:8888/my
容器需要找到端口8888中部署的项目(目前项目没有项目名http://localhost:8888)
http://localhost:8888 对应的项目就是 hebei_web
请求中要访问 /my ,容器通过web.xml中的配置(或注解)
1.寻找 url-pattern ,如没有对应的 报404
2.找到了,通过servlet-mapping 中的servlet-name 找对应的
servlet中的 servlet-name ,最后找到了 servlet-class
3.找到 class之后,就知道运行哪个java类了,
4.请求如果是 get ,执行doGet(),如果post请求,就执行 doPost()
5.doXX方法 需要两个参数:
HttpServletRequest req 包含了请求中的信息
HttpServletResponse resp 包含了响应的信息
当你处理完请求,可以通过Response对象来编程做响应
这两个参数是容器中的对象,容器在调用方法时,为你传参
读取客户发送的所有数据 ,填写表单,或者路径上写参数
查询HTTP请求中包含的任何其他请求信息,比如头信息
处理数据并生成结果,调用Service
设置合适的HTTP响应参数
将响应信息回送给客户端*/
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务器接收到客户端get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务器接收到post请求");
}
}
2.web.xml的配置
<!--配置全局变量-->
<context-param>
<param-name>name</param-name>
<param-value>lijia</param-value>
</context-param>
<welcome-file-list>
<!--以下都是首页-->
<welcome-file>/index.html</welcome-file>
<welcome-file>/index.jsp</welcome-file>
<welcome-file>/defualt.html</welcome-file>
<welcome-file>/defualt.jsp</welcome-file>
</welcome-file-list>
<!--配置Servlet-->
<servlet>
<!--配置名称,自定义,通常和类同名-->
<servlet-name>MyServlet</servlet-name>
<!--类路径-->
<servlet-class>com.li.web.MyServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--和上面对应的名称-->
<servlet-name>MyServlet</servlet-name>
<!--web的访问路径-->
<url-pattern>/my1</url-pattern>
</servlet-mapping>
<!--按异常号码来处理-->
<error-page>
<error-code>404</error-code>
<location>/error/error404.jsp</location>
</error-page>
<!--按异常类型进行出来-->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error/error500.jsp</location>
</error-page>
2、servlet类的创建(使用注解)
@WebServlet():括号中给一个值默认为访问路径
@WebServlet("/MyServlet001")
public class MyServlet001 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
3.Servlet 生命周期
-
加载、实例化、初始化init() (第一次访问时,只加载一次)
-
服务阶段 service() (处理请求,执行doXX() )
-
销毁 destroy() (服务器关闭)
public class MyServlet extends HttpServlet {
public MyServlet(){
System.out.println("对象被创建了。。。");
}
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("init初始化方法被调用。。。");
System.out.println("name的值为"+config.getServletContext().getInitParameter("name"));
}
@Override
public void destroy() {
System.out.println("对象被销毁了。。。。。");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务器接收到客户端get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("服务器接收到post请求");
}
}
4.HttpServletRequest接口(request)
4.1、作用
1.提取客户端请求信息(表单信息,HTTP请求报头信息,cookie)
2.修改字符集
3.在服务器端保存值
4.WEB资源跳转——请求转发
4.2、常用方法
1.String getParameter(String name) 获取请求中参数为name的参数值。
2.String[] getParameterValues(String name) 获取请求中参数名为name的参数值的集合
3.Enumeration getParameterNames() 获取请求中所有参数名的集合
4.ServletInputStream getInputStream() 获取客户端请求的数据
5.String getMethod() 获取HTTP请求方法
6.String getRemoteAddr() 获取客户端的IP
7.setCharacterEncoding() 修改网页提交过来数据的字符编码方式
8.getRequestDispatcher(xxx.jsp).forward(request,response) 请求转发
@WebServlet("/MyServlet001")
public class MyServlet001 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置页面提交数据的编码格式
request.setCharacterEncoding("UTF-8");
//获取页面表单数据
String username = request.getParameter("username");
System.out.println("姓名:"+username);
//获取多选参数
String sex = request.getParameter("sex");
System.out.println("性别:"+sex);
String[] addrs = request.getParameterValues("addr");
System.out.println(Arrays.toString(addrs));
//获取参数列表名
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()){//判断是否有枚举值
System.out.println(names.nextElement());//获取
}
request.setAttribute("username","xxx");
request.getRequestDispatcher("text.jsp").forward(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
5.HttpServletResponse接口(response)
常用方法
1.void setContentType(String type) 设置输出内容(MIME)类型
2.void setContentLength(int length) 设置响应报文的长度
3.PrintWriter getWriter() 返回可以向客户端发送字符数据的PrinterWriter对象
4.ServletOutputStream getOutputStream() 返回可以向客户端发送二进制数据的输出流对象
5.void addCookie(Cookie c) 向报头插入一个cookie
6.void sendRedirect() 重定向
7.setCharacterEncoding() 修改响应到网页的字符编码方式
/*
重定向:
1.可以向站内、站外(绝对路径)定向
2. 地址栏地址会改变
3. 可以传达数据,只能是字符串,加在地址上。比如 index.jsp?xxx=xxx
4. Response 调用执行的
5. 重定向后的代码也会执行
6. 请求次数最少有两次, 服务器在第一次请求后,会返回302 以及一个地址, 浏览器在根据这个地址,执行第二次访问。
7. 效率稍微低一点, 执行两次请求。
8. 后续的请求,没法使用上一次的request存储的数据,或者 没法使用上一次的request对象,因为这是两次不同的请求。
*/
resp.sendRedirect("/demo001/index.jsp?login=1");
常用的MIME类型
- text/plain 纯文本
- text/html HTML文档
- image/图像格式 图片,如image/gif
- application/msword Microsoft Word 文档
- application/vnd.ms-excel Excel电子表格
- application/octet-stream 未经识别或二进制的数据
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//响应文档类型
resp.setContentType("text/plain");
//响应字符集
resp.setCharacterEncoding("UTF-8");
//获得输出流
PrintWriter out = resp.getWriter();
out.println("<html>");
out.println("<head><title>zyw response</title></head>");
out.println("<body>");
out.println("<h1>hello</h1>");
out.println("</body>");
out.println("</html>");
out.flush();
out.close();
}