一。servlet的特点,生命周期
单实例 非线程安全的 性能高于多实例
比如统计访问人数
Integer i=0;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
synchronized (i) {
i++;
}
}
servlet实例化默认是在第一次访问时
loadOnStartup() default (int) -1; 第一次访问实例化
>=0任何值 都是在web服务器启动时
不带参数的init方法是在父类带参数的init方法中调用 如果重写了带参数的init方法 必须手工调用super.init(ServletConfig config)
public void init()
public void init(ServletConfig config) throws ServletException {
service方法 所有的请求都需要先经过service方法 service根据请求的类型决定调用doGet doPost
重写了service方法 添加 super.service(req, resp);
destroy方法
当容器销毁servlet实例时 自动调用 (容器关闭,自动reload模式启动后的源代码修改)
二。 工作中常用的快捷键
ctrl+H 搜索整个工作空间 找源代码
ctrl+O 搜索类中的方法
ctrl+L 通过异常 行号 定位源代码位置
ctrl+1 代码自动修正
ctrl+shift+R 通过名称找到某个资源
ctrl+shift+T 通过类名找到类的位置
ctrl+T 找到某个接口的实现类
alt+后退键
alt+/ 代码提示
三。请求转发和重定向
请求转发
一次请求 服务器端跳转 浏览器不知道跳转地址栏不会发生变化 参数可以传递 是同一个同一个请求对象
重定向
二次请求 客户端(浏览器)跳转 浏览器知道要跳转的路径 参数丢失 不是同一个同一个请求对象
跨域访问
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Servlet 必须继承HttpServlet
public class Test extends HttpServlet {
//初始化方法Servlet在执行时会先执行这个方法
public void init() {
}
//自动调用doget方法(业务处理方法)
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException, ServletException {
/*//设置响应的内容类型*/
response.setContentType("text/html;charset=UTF-8");
//获取输出流
PrintWriter out=response.getWriter();
String id=request.getParameter("stuId");
String str=MysqlTest.query(id);
out.println(str);
//this.doPost(request, response);
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost");
//设置编码
request.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
//获取参数
String stuName= request.getParameter("stuName");
String stuSex= request.getParameter("stuSex");
String stuAge= request.getParameter("stuAge");
/*try {
Thread.sleep(10000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}*/
System.out.println("姓名:"+stuName+" 性别:"+stuSex+" 年龄:"+stuAge);
try {
MysqlTest.test(stuName, stuSex,stuAge);
} catch (ClassNotFoundException | SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//页面跳转
//request.getRequestDispatcher("index.html").forward(request, response);
PrintWriter out=response.getWriter();
out.write("{\"issuccess\":\"true\"}");
}
/*public void doPut() {
}*/
//销毁
public void destroy() {
super.destroy();
}
}
package com.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Test extends HttpServlet {
private static final long serialVersionUID = 1L;
public void init() {
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("doGet");
//设置响应的text格式为UTF-8
response.setContentType("text/html;charset=UTF-8");
PrintWriter pr=response.getWriter();
//获取提交方法
/*String str=request.getMethod();
pr.write("提交方法:"+str);
pr.write("获取参数的值:"+request.getParameter("id"));
pr.write("获取项目名称:"+request.getContextPath());
pr.write("获取请求的客服端地址"+request.getRequestURI().toString());
pr.write("获取请求的客户端主机名:"+request.getRemoteHost());*/
for (int i = 1; i <=10; i++) {
pr.write("<h1>"+i+"</h1><br>");
}
}
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
System.out.println("doGet");
}
public void destroy() {
super.destroy();
}
}
package com.test2;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(urlPatterns= {"/c"})
public class Demo4 extends HttpServlet {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext sc = this.getServletContext();
//初始化参数
String initParameter = sc.getInitParameter("url");
System.out.println(initParameter);
//提供了数据共享
sc.setAttribute("sex", "a");
sc.getAttribute("sex");
//读取wed资源 相对路径
InputStream ia = sc.getResourceAsStream("/a.txt");
int available = ia.available();
byte[] b=new byte[available];
ia.read(b);
ia.close();
resp.getWriter().write(new String(b));
//日志
sc.log("呵呵");
}
}
``