java学习笔记—HttpServletResponse(23)

获取客户端信息

1 编写ClientServlet.java

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 获取客户端信息
out.println("getMethod(): "+request.getMethod()+"<br/>");
out.println("getRequestURL(): "+request.getRequestURL()+"<br/>");
out.println("getRequestURI(): "+request.getRequestURI()+"<br/>");
out.println("getProtocol(): "+request.getProtocol()+"<br/>");
out.println("getQueryString(): "+request.getQueryString()+"<br/>");
out.println("getRemoteAddr(): "+request.getRemoteAddr()+"<br/>");
out.println("getRemoteHost(): "+request.getRemoteHost()+"<br/>");
out.println("getRemotePort(): "+request.getRemotePort()+"<br/>");
out.println("getServletPath(): "+request.getServletPath()+"<br/>");
out.println("getContextPath(): "+request.getContextPath()+"<br/>");
}

以上的方法可以发现通过使用request可以获取servlet和servletContext的路径。那么在实际的开发中我们的网站的名字一般都需要进行改变。因此以后在web项目中如果使用到网站名那么一定要使用request.getContextPath()获取出来而不是写死。这样可以提高后期的维护性。

2 获取服务器信息

编写一个GetServerInfo.java

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setCharacterEncoding("utf-8");
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 获取客户端信息
out.println("getLocalAddr(): " + request.getLocalAddr() + "<br/>");
out.println("getLocalName(): " + request.getLocalName() + "<br/>");
out.println("getLocalPort(): " + request.getLocalPort() + "<br/>");
}

3 请求转发

  1. 访问路径

http://localhost:8080/demo1?name=jack&password=root

实现一个处理用户请求的Demo1Servlet

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        // 获取用户的请求的参数
        String name = request.getParameter("name");
        String psw = request.getParameter("password");
        // 判断用户输入的信息
        if(name != null && psw != null && "jack".equals(name)
&& "root".equals(psw)){
            // 登陆成功需要将用户信息传递给欢迎页面
            request.setAttribute("name", name);
            // 登陆成功将页面转发到欢迎页面
            request.getRequestDispatcher("/demo2")
.forward(request, response);
        }else{
         request.getRequestDispatcher("/regist.html")
.forward(request, response);
        }
}

  2. 编写一个转发后的Demo2Servlet

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        PrintWriter out = response.getWriter();
        // 获取转发过来的数据
        String name = (String) request.getAttribute("name");
        out.println("欢迎光临:"+name);
    }

转发和重定向的区别

1.    实现方式不同
转发  request.getRequestDispatcher("/regist.html").forward(request, response);
重定向 response.sendRedirect(“/day07/regist.html”)
2.    请求次数不同
转发只发送一次请求
重定向发送2次请求
3.    地址栏变化不同
转发地址栏不变
重定向地址栏变化
4. 转发的时候可以通过request对象携带数据。

Web中路径问题

如果在web项目中需要使用路径,如:转发、重定向还有超链接等。

原则:”一切web路径以/开始”

那么/的路径一定是相对路径,那么/到底代表哪一个相对路径是需要智慧的。

如果该路径是给服务器使用的,那么/代表当前网站的根目录。
如果该路径是给浏览器使用的,那么/代表当前Tomcat的webapps目录。
时间: 2024-11-06 17:03:30

java学习笔记—HttpServletResponse(23)的相关文章

java学习笔记—HttpServletResponse(21)

public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { // 获取字节流对象 ServletOutputStream out = response.getOutputStream(); // 获取字符流对象 PrintWriter writer = response.getWriter(); out.write("image&

java学习笔记—HttpServletResponse(22)

1  乱码处理 GET请求使用直接通过地址栏回车或超链接的单击以及form表单中method的get数据提交过来的请求,该请求和传递用户参数的方式是http://www.jnb.com?name=jack&age=36 因此可见get方式的请求参数有限(小于1K).而且传递的数据直接在地址栏可见.如: 百度的搜索关键字. 1.1      编写一个提交get数据的一个注册表单 <form action="/day07/regist" method="get&qu

java学习笔记9.23(集合)

集合接口: java类库将集合的接口和实现分离.队列的实现:循环数组和链表:前者更高效,后者没有上限. AbstractQueue类用于用户自己实现队列类. cllection(extends Iterable<E>)接口:基本方法1.add 2 iterator(next;hasnext;remove) Collection<E> coll=new Collection<>(); Iterator<String> iter=coll.iterator();

Java学习笔记_25_Collections类

25.Collections类: Collections类是一个工具类,用来对集合进行操作,它主要是提供一些排序算法,包括随机排序.反相排序等. Collections类提供了一些静态方法,实现了基于List容器的一些常用算法. Collections的一些方法列表: · void sort(List): 对List内的元素进行排序. · void shuffle(List): 对List内的元素随机排序. · void reverse(List): 对List内的元素进行逆序排列. · voi

java学习笔记3——java关键字

java学习笔记3——java关键字 虽然老师说不用刻意的去记忆,但是我还是在网上找到了非常详细的注解,再次收藏 关键字的类型表: 各个关键字的详细注解和实例,按首字母排序: 1.abstract abstract 关键字可以修改类或方法. abstract 类可以扩展(增加子类),但不能直接实例化. abstract 方法不在声明它的类中实现,但必须在某个子类中重写. -示例- public abstract class MyClass{ } public abstract String my

【Java学习笔记之二十六】深入理解Java匿名内部类

在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意的事项.如何初始化匿名内部类.匿名内部类使用的形参为何要为final. 一.使用匿名内部类内部类 匿名内部类由于没有名字,所以它的创建方式有点儿奇怪.创建格式如下: new 父类构造器(参数列表)|实现接口() { //匿名内部类的类体部分 } 在这里我们看到使用匿名内部类我们必须要继承一个父类或者

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

Java学习笔记之接口

一.接口的概念与定义 首先考虑一个简单的接口的定义: public interface Output { int MAX_LINE = 40; void out(); void getData(String msg); } 定义接口使用关键字interface 修饰符interface前面的public可以省略,如果省略,则采用默认访问控制,即只有在相同包结构的代码才可以访问此接口 接口不可以有构造方法(区别于类中的构造方法) 接口里面的所有成员,包括常量.方法等都是public访问权限,所以在

java学习笔记13--比较器(Comparable、Comparator)

java学习笔记13--比较器(Comparable.Comparator) 分类: JAVA 2013-05-20 23:20 3296人阅读 评论(0) 收藏 举报 Comparable接口的作用 之前Arrays类中存在sort()方法,此方法可以直接对对象数组进行排序. Comparable接口 可以直接使用java.util.Arrays类进行数组的排序操作,但对象所在的类必须实现Comparable接口,用于指定排序接口. Comparable接口的定义如下: public  int