req.getServletContext
每一个maven做的module形成的类都是一个servlet,在配置tomcat时,保证.war只有一个,可以省时间。
为了对每个Servlet的数据做共享,所以有ServletContext,管理全部的servlet,进行数据共享。
(setAttribute) 、、(getAttribute)
///设置数据
ServletContext servletContext = req.getServletContext();
String name = "ljs";
servletContext.setAttribute("name",name);
得到数据
ServletContext servletContext = req.getServletContext();
String name = (String) servletContext.getAttribute("name");
resp.getWriter().print("name:" + name);
<context-param>
<param-name>userparam-name>
<param-value>rootparam-value>
context-param>
ServletContext servletContext = req.getServletContext();
resp.getWriter().print("user:" + servletContext.getInitParameter("user"));
ServletContext servletContext = req.getServletContext();
resp.getWriter().print("user:"+servletContext.getRequestDispatcher("/gp"));
resources和java的文件都会被打包到target的calsses(类路径)。
maven中导出文件可能失败,在java里面的properties就不行,需要写等文件,在web.xml中。
资源文件需要通过转换流,getServletContext().getResourceAsStream然后由properties对象load(InputSteam)获取到,就可以进行其他的操作了。
public class ServResp extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 获取下载文件路径-----------1
String path = "D:\\JAVA_project\\javaweb-01-maven\\servletresp\\src\\main\\resources\\image.jpeg";
// 获取下载文件名-----------2
String filename = path.substring(path.lastIndexOf("\\")+1);
//设置浏览器支持我们需要下载的东西----3
resp.setHeader("Content-Disposition","attachment;filename="+filename);
//获取下载的文件输入流----------4
FileInputStream fileInputStream = new FileInputStream(path);
//创建缓存区---------5
int len=0;
byte[] buff = new byte[1024];
//获取用于输出的对象----------6
ServletOutputStream outputStream = resp.getOutputStream();
//将输入传到缓存区,然后用上面的输出对象输出缓存区的内容---------7、8
while ((len = fileInputStream.read(buff)) > 0){
outputStream.write(buff,0,len);
}
fileInputStream.close();
outputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws IOException {
doGet(req, resp);
}
}
重定向:客户端A向服务器发送请求访问C,但是访问到了B,B返回C的URL给A,让A重新去找C
重定向与请求转发的区别:
两者都会跳转页面,但是重定向的URL会改变,请求转发不会。
resp.sendRedirect("/419/image");//重定向的路径为当前项目下的绝对路径,其中的image为映射的URL别名
//本质:
resp.setHeader("Location", "/419/image");
resp.setStatus(302);
${pageContext.request.contextPath}//表单的action路径获取
//获得前端表单的参数
String name = req.getParameter("username");
String pwd = req.getParameter("pwd");
用网站显示一个即时刷新的数据
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//自动刷新
resp.setHeader("refresh","3");
//内存中创建图片
BufferedImage bufferedImage = new BufferedImage(80, 20, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = (Graphics2D)bufferedImage.getGraphics();
//图片背景颜色
graphics.setColor(Color.white);
graphics.fillRect(0,0,80,20);
//给图片数据
graphics.setColor(Color.black);
graphics.setFont(new Font("宋体",Font.BOLD,20));
graphics.drawString(makeNum(), 0,20);
//告诉浏览器,这个请求以图片形式打开
resp.setContentType("image/jpg");
//不让浏览器缓存
resp.setDateHeader("expires",-1);
resp.setHeader("Cache-control", "no-cache");
resp.setHeader("Pragma", "no-cache");
//写图片给浏览器
ImageIO.write(bufferedImage, "jpg", resp.getOutputStream());
}
private String makeNum(){
Random random = new Random();
String i = random.nextInt(99999 ) + "";
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 5 - i.length(); j++) {
sb.append("0");
}
i = sb.toString() + i;
return i;
}
传递多个参数,用getParameterVlues,会返回一个数组
这里通过Arrays.toString(array),进行输出
通过请求进行转发,而不是重定向,注意其使用路径的不同
req.getRequestDispatcher("success.jsp").forward(req,resp);
会话:用户打开一个浏览器,这个时候可以访问各种资源,然后关闭浏览器,这个过程就可以说是会话。
有状态会话:来过下次再来就有记录了
Cookie[] cookies = req.getCookies();//cookie可能有多个,是一个数组
cookie.getName(); //获得其中的key
cookie.getValue(); //获得其中的value
Cookie cookie = new Cookie("lastloginname", System.currentTimeMillis() + "");
cookie.setMaxage(___) //设置过期时间
resp.addCookie(cookie);
//获得时间======
if (cookies != null){
writer.write("上次访问的时间:");
for (Cookie cookie : cookies) {
if(cookie.getName().equals("lastloginname")){ //和得到的键值比较
long lastTime = Long.parseLong(cookie.getValue()); ///解析得到的值
Date date = new Date(lastTime); //转换为Date类
writer.write(date.toLocaleString()); //输出数据
}
}
}
如果中文输不出来的话,可以试试
URLEncoder.encode(“str”,“utf-8”); URLDecoder.decode(value,“utf-8”);
*** session不仅能存数据,还能存一个对象***
//session的本质
Cookie cookie = new Cookie("JSESSIONID",sessionid);
resp.addCookie(cookie);
//得到session和设置属性
HttpSession session = req.getSession();
session.setAttribute("name", new Person("李四", 29));
//得到属性
Person person = (Person) session.getAttribute("name");
//消除属性
session.removeAttribute("name");
//手动注销
session.invalidate();
//自动注销(web.xml)中配置
<!--自动注销,以分钟为单位-->
<session-config>
<session-timeout>1</session-timeout>
</session-config>