- Servlet->GenericServlet->HttpServlet
ServletRequest,ServletResponse ->HttpServletRequest,HttpServletResponse. - 在web.xml文件中,设置
<servlet>//注册一个servlet
<servlet-name>HelloServlet</servlet-name>//起一个名字
<servlet-class>science.yueling.servlet.HelloServlet<servle t-class>//限定到一个class中
</servlet>
<servlet>
<servlet-name>HelloServlet</servlet-name>//与之前的servlet名字相呼应
<url-pattern>/Hello</url-pattern>//指定对外访问的路径
</servlet>
3 . 利用service获得参数并进行相应的处理,处理request和response.
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("uname");
String password = req.getParameter("upwd");
System.out.println("用户名 ==》 " + userName);
System.out.println("密码 ==》 " + password);
}
4 . 在某些情况下利用doGet和doPost方法替代service可以更安全更有针对性。
5 . 转发,一些情况下可能比重定向(sendRedirect)更好用。
但是只能在本应用中转发,重定向可以转到任何地方。
String forwards = null;
forwards = "/success.jsp";
RequestDispatcher rd = req.getRequestDispatcher(forwards);//重定向到指定链接
rd.forward(req,resp);//执行
6 . servlet 尽量使用局部变量或者使用同步,不然会出现线程不安全的问题。
7 . 一个servlet可以映射到多个url当中。
8. 可以使用地址通配符描述url-pattern。
9. 一切都是 Servlet,访问某个静态资源也不过是访问某个缺省Servlet。
10. < load-on-startup>2< /load-on-startup>决定了启动时就初始化的顺序。
11. ServletContext存储的数据可以在多个用户之间共享,利用ServletContext做数据中转。
//1
ServletContext sc = getServletContext();
sc.setAttribute("key","value");
//2
String str = (String)sc.getAttribute("key");
12 . 转发,但是链接没有变
ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/servlet");//必须以斜线开头,代表当前应用的路径。
rd.forward(request, response);
13 . 文件传输:
ServletContext sc = getServletContext();
String realPath = sc.getRealPath("/WEB-INF/classes/27.jpg");//src文件结构下,得到真实路径
InputStream in = new FileInputStream(realPath);
String filename = realPath.substring(realPath.lastIndexOf(File.separator)+1);//得到文件缀
response.setHeader("Content-Type", "application/octet-stream");//清空缓存
response.setHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(filename,"UTF-8"));//声明下载,将文件转码,防止编码导致的问题。
OutputStream out = response.getOutputStream();
int len = -1;
byte b[] = new byte[1024];//以二进制格式输出
while((len=in.read(b))!=-1){
out.write(b, 0, len);
}
in.close();
out.close();
14 . 利用文件流和Properties 对象获取.properties文件的属性。
15. 输出中文信息,要以UTF-8输出,但是需要提前设置相应头告知浏览器文本格式。
//字节流
response.setContentType("text/html;charset=UTF-8");
ServeletOutputStream out = response.getOutputStream();
out.write(str.getBytes("UTF-8"));
//字符流
//既可以改变字符流查的码表,还能告知浏览器用什么解码。
response.setContentType(text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.write(str);
16 . 输出验证码图像:
int width = 120;
int height = 25;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);//图片类型
Graphics g = image.getGraphics();//创建画布
g.setColor(Color.BLUE);//选择颜色
g.drawRect(0, 0, 120, 25);//画矩形
g.setColor(Color.YELLOW);
g.fillRect(1,1,width-2, height-2);//填充
g.setColor(Color.GRAY);
Random r = new Random();
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height));
//写验证码
g.setColor(Color.RED);
g.setFont(new Font("宋体", Font.ITALIC|Font.BOLD, 19));
g.drawString(r.nextInt(10)+"", 20, 20);
ImageIO.write(image, "jpg", response.getOutputStream());
17 . 定时刷新页面。
resp.setContentType("text/html;charset=UTF-8");
resp.setHeader("Refresh", "4;URL=http://localhost:8080/LoginTest2/show.jsp");
resp.getWriter().write("登录成功,4秒后跳转到主页");
18 . 设置缓存时间,一般缓存静态资源,动态资源不要缓存
response.setDateHeader("Expires", System.currentTimeMillis()+1*60*60*1000);
19 . 字节流和字符流,getOutputStream,getWriter(),只能用其中一个,字节流功能都能实现,但字符流方便,response的流用完后自动关闭。
20. 常用方法。
String method = request.getMethod();//请求方式
String uri = request.getRequestURI();// /day08_01_request/servlet/RequestDemo1
String url = request.getRequestURL().toString();// http://localhost:8080/day08_01_request/servlet/RequestDemo1
String protocal = request.getProtocol();//客户端使用的协议
String remoteIp = request.getRemoteAddr();//来访者的ip
int port = request.getRemotePort();// 随机的
String queryString = request.getQueryString();//GET方式:/day08_01_request/servlet/RequestDemo1?username=abc&password=123
21 . include只会包含正文,不会包含头信息。