JavaWeb初级学习 之 Servlet

1.Servlet中的两个接口

ServletConfig

代表:Servlet的配置信息

作用:


1)获取Servlet的友好名称
String servletName = config.getServletName();
2)获取Servlet的初始化参数
 前提是已经在web.xml文件中进行了配置

<servlet>
	<servlet-name>ServletConfServlet</servlet-name>
	<servlet-class>com.atguigu.servlet.ServletConfServlet</servlet-class>
	<init-param>
		<param-name>username</param-name>
		<param-value>admin</param-value>
	</init-param>
</servlet>
获取
String initParameter = config.getInitParameter("username");

 3)获取ServletContext
ServletContext servletContext = config.getServletContext();

ServletContext

代表:当前Web应用
作用:
1)获取当前Web应用的初始化参数
//Web应用的初始化参数是全局的,每个Servlet都可以拿到
String initParameter2 = servletContext.getInitParameter("encode");

前提是已经在web.xml文件中进行了配置

<!-- 设置当前Web应用的初始化参数 -->
<context-param>
	<param-name>encode</param-name>
	<param-value>utf-8</param-value>
</context-param>

//Web应用的初始化参数是全局的,每个Servlet都可以拿到
String initParameter2 = servletContext.getInitParameter("encode");


2)获取服务器端资源的真实路径
String realPath = servletContext.getRealPath("/index.html");

3)作为一个域对象存在


2.请求和响应

HttpServletRequest request

        代表:request代表了浏览器发送给服务器的请求报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在两个方法中可以直接使用
        作用:
            1)获取请求参数
String userName = request.getParameter("username");
String password = request.getParameter("password");

            2)获取当前Web应用的路径
String contextPath = request.getContextPath();

            3)转发

//获取转发器
RequestDispatcher requestDispatcher = request.getRequestDispatcher("success.html");
//转发
requestDispatcher.forward(request, response);
            4)作为一个域对象存在

    HttpServletResponse response

        代表:response 代表了服务器发送给浏览器的响应报文,该对象由服务器创建并以参数的形式传入到doGet和doPost方法中,在两个方法中可以直接使用
        作用:
            1)给浏览器响应一个页面或页面的一个片段
PrintWriter writer = response.getWriter();
writer.write("<h1>Response Success!</h1>");

            2)重定向
response.sendRedirect("success.html");

    转发与重定向的区别
①转发发送一次请求;重定向发送两次请求
②转发浏览器地址栏无变化;重定向浏览器地址栏有变化
③转发可以访问WEB-INF下的资源;重定向不可以访问WEB-INF下的资源
④转发可以共享request域对象中的资源;重定向不可以共享request域对象中的资源

3.Web应用中的路径问题

    相对路径不靠谱
        在转发的情况下,由于地址栏无变化会导致浏览器解析地址出错,所以不建议使用相对路径,建议使用绝对路径。
    绝对路径
        什么是绝对路径:以 / 开头的路径即为绝对路径
        绝对路径中的 / 代表什么?
            如果地址由浏览器解析:
                / 就代表当前服务器: 例如: http://localhost:8080
                那些地址由浏览器解析?
                    1)html标签中的路径:例如img标签中额src属性,a标签中的href属性,link标签中的href属性,script中的src属性,form标签中的action属性
                    2)重定向中的路径
            如果地址由服务器解析:


                / 就代表当前Web应用: 例如:http://localhost:8080/Web01_Servlet_Ex
                那些地址由服务器解析?
                    1)web.xml中的 <url-pattern>/LoginServlet</url-pattern>中的路径
                    2)转发中的路径

4.中文乱码问题

    编码:将字符转换成二进制数
    解码:将二进制数转换成字符
    乱码:编码和解码使用的字符集不一致就会导致乱码

    请求乱码

        浏览器发送给服务器:
            浏览器编码:浏览器编码使用的字符集就是html页面指定的字符集
            服务器解码:服务器默认的字符集是ISO-8859-1
            所有出现了乱码
            解决方案:
                对于POST请求
//改操作一定要在第一次获取请求参数之前
request.setCharacterEncoding("utf-8");

                对于GET请求
                使用POST请求的方式不管用:
                    因为Get请求的请求参数在地址栏中,在到达Servlet之前已经被服务器进行解析,所以在Servlet中设置字符集不管用
                    Get请求的乱码问题需要在server.xml中的第一个Connector标签中添加一个属性:URIEncoding="UTF-8"

    响应乱码

        服务器发送给浏览器
            服务器编码:服务器默认的字符集是ISO-8859-1
            浏览器解码:默认使用GBK进行解码
            解决方案:
                通过设置响应头告诉浏览器使用UTF-8字符集进行解码
//设置响应头 
response.setHeader("Content-Type", "text/html;charset=utf-8");
//设置ContentType
response.setContentType("text/html;charset=UTF-8");

            当在响应头中设置了字符集之后Servlet也会使用设置的字符集进行编码

猜你喜欢

转载自blog.csdn.net/OnlyLove_longshao/article/details/53123038