欢迎访问我的blogThe Blog of Dxhua
JavaWeb学习笔记之Http和Servlet(一)
1.http:超文本传输协议
包括请求行、若干请求头、请求体
所以get请求一般用于查询数据,post请求一般用于提交数据操作,两者的区别就是在实际开发中get请求会受到URL的限制,而post由于没有将请求参数放在URL中,理论上不受URL的限制
DELETE用于删除数据的时候,PUT用于更新数据的时候
2.servlet
@WebServlet(name = "TestServlet",urlPatterns = "/test")
public class TestServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet收到GET请求");
//获取请求行内容
System.out.println("请求方式:"+request.getMethod());
System.out.println("URL:"+request.getRequestURI());
System.out.println("发出请求的客户端地址:"+request.getRemoteAddr());
System.out.println("服务点接收请求的IP地址:"+request.getLocalAddr());
System.out.println("访问客户端的端口号:"+request.getRemotePort());
System.out.println("web应用路径:"+request.getContextPath());
System.out.println("协议版本:"+request.getProtocol());
//获取请求头内容
Enumeration headername = request.getHeaderNames();
while (headername.hasMoreElements()){
String element = headername.nextElement();
System.out.println(element+":"+request.getHeader(element));
}
}
}
结果如下
注意:Servlet是单例的,即无论请求多少次servlet,最多只有一个servlet单例,如果多个客户端同时访问Servlet的时候,服务器会启动多个线程分别执行Servlet的service()方法
如果我们每次访问都创建一个实例,就会占用计算机资源
通过ServletConfig的getServletContext()方法可以得到ServletContext对象
HttpServlet中直接通过this.getServletContext()获取,
通过ServletContext对象来实现多个Servlet对象之间共享参数,首先在一个Servlet中获取到ServletContext对象,然后通过setAttribute()方法将参数放置到ServletContext对象中,在
其他servlet对象中,先说去到ServletContext对象,在通过getAttribute()方法来获取到共享的参数。
利用ServletContext对象来读取项目的资源文件
首先通过this.getServletContext()方法获取到ServletContext对象,在通过getResourceAsStream(“文件路径”)读取一个文件的路径,返回一个文件流,具体使用如下:
InputStream resourceAsStream = this.getServletContext().getResourceAsStream("/db.propetties");
然后读取配置文件,固定方法可以记下来
Properties properties = new Properties();
properties.load(resourceAsStream);//把拿到的输入流放进去
String name = properties.getProperty("name");//拿到配置文件中固定的值
String passWord = properties.getProperty("passWord");
String url = properties.getProperty("url");
System.out.println("name:"+name);
System.out.println("passWord:"+passWord);
System.out.println("url:"+url);
MVC:(mode,view,controller)用一种业务逻辑、数据、界面显示分离的方法构建代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面的同时,
不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、处理和输出功能在一个业务逻辑的图形化用户界面中
request.getRequestDispatcher("/loginError.jsp").forward(request,response);//getRequestDispather()中的参数为资源路径
转发过程中携带数据 :
在转发过程中传递参数不易使用ServletContext对象来传递,因为ServletContext对象是一个共享域对象,当产生不同的错误时,会把前面的错误给覆盖掉,所以这里采用request。
request本身也是一个域对象,request可以携带数据传递给其他web资源
setAttribute()方法 :
getAttribute()方法:
removeAttribute()方法:
getAttributeName()方法:
通过request对象的setAttribute()方法
//设置状态码为302,SC_MOVED_TEMPORAILY是302的静态常量
resonse.setStatus(HttpServletResponse.SC_MOVED_TEMPORAILY);
//在请求头中携带新资源的地址
response.setHeader("Localtion","http://www.baidu.com");//在请求重定向的时候,地址需要加入项目名,在访问其他网站地址时,只需要填入其他地址就可以了
重定向的流程如下图所示:
为了使用方便HttpServletResponse中将setStatus和setHeader这两个方法合并在一起叫做sendRedirect(String Localtion)
请求转发和重定向的区别:
(1)重定向浏览器的地址栏会发生改变,而请求转发不会,因为请求转发是在服务器内部完成的,浏览器不知道进行了转发,而重定向是ServletA告诉了浏览器我不能处理,并返回了一个新的地址,有浏览器重新去访问这个新的地址,所以地址栏是会改变的
(2)重定向是两次请求两次响应,请求转发是一次请求一次响应
(3)重定向的路径需要加工程名,请求转发路径不需要加工程名
(4)重定向可以跳转到任何网页,而请求转发只能在服务器内部进行
实现Servlet的的自动刷新
// response.setContentType("text/html;charset=utf-8");
// response.setHeader("refresh","3;url='/hello/home.html'");
// response.getWriter().print("3秒后自动刷新");//在实际的项目中自动跳转或者刷新一般不写在Servlet中,一般在jsp中实现
String message = "3秒后会自动跳转到首页,如果没有跳转,请点击跳转链接";
//meta标签可以模仿一个http的响应头
request.setAttribute("message",message);
request.getRequestDispatcher("/index.jsp").forward(request,response);