A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 付付付付付 初级黑马   /  2018-5-21 15:29  /  820 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-5-23 15:46 编辑

servlet---jsp

Servlet访问规则:
http://ip:port/projectName/地址串(servlet配置名)
即:        http://ip地址:端口号/项目名/servlet配置名
如果要访问一个servlet,这个地址串跟web.xml中配置的url-pattern有关系
生命周期(面试点一)
服务器启动时,自动创建一个servlet实例,执行init()方法,客户端任何一次多线程访问servlet都会调用service()方法,通过获得请求方式,调用相应的doXXX()方法,当服务器关闭或者servlet被移除时,自动调用distory()方法消除servlet实例,服务器每次开启servlet只能被创建一次
程序优化的思想:
一次性的资源的加载(耗时的操作)放到服务器启动的时候(在init()方法中进行初始化操作)
url-pattern的配置方式
1.完全路径匹配:以/开头     /aaa                                            http://ip:port/projectName/aaa
2.目录匹配:以/开头 以*结尾         /aa/ *                               http://ip:port/projectName/aa/fadsfadfda
3.扩展名匹配:不能以/开头 以*开头     *.do  *.action          http://ip:port/projectName/afdafdadfadsfadf.do
优先级关系:根本的原因,一次请求只有一次响应
完全路径匹配 > 目录匹配 > 扩展名匹配
ServetContext
如何获得:在有servlet的环境下:this.getServletContext();
范围:整个web应用的范围
域对象存取数据
setAttribute(String name,Object value);
Object      getAttribute(String name);
removeAttribute(String name)
读取web项目下的文件
1.有servlet的环境下:
​        InpuptStream getResourceAsStream(String path);
​        String getRealPath(String path);
2.如果没有servlet的环境:
​        用类加载器去读取文件:
​        InpuptStream  is = 当前类的类名.class.getClassLoader().getResourceAsStream(String name);
企业级工具类的一个编写思想(抽取)Response文件下载
把一个文件从服务器读取,写到客户端
文件下载的核心思想:io 读/写的操作
InpuptStream is = new FileInputStream("服务器上的路径");
OutputStream os = response.getOutputStream();
模板代码:

int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!= -1){
    os.write(b, 0, len);
}
is.close();
Content-Type: getServletContext().getMimeType(String filename);Content-Disposition:"attachment;filename="+filename;
响应乱码
response.getOutputStream():文件下载
下列方式:以后不常用
response.getWriter().print("");这种乱码问题如何解决:response.setContentType("text/html;charset=UTF-8");  
Request获取客户端信息
1.请求方式:request.getMethod();
2.请求ip:request.getRemoteAddr();
3.获取工程名:request.getContextPath();
获取表单参数
String request.getParameter(String name);
String [] request.getParameterValues(String name);
Map<String,String[]> request.getParameterMap();
请求乱码
get:
​        String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8")
post:
​        request.setCharacterEncoding("UTF-8")
作为域对象存取数据
范围:一次请求和响应的范围
setAttribute(String name,Object value);
Object      getAttribute(String name);
removeAttribute(String name)
转发和重定向(面试点二)
转发:
​        request.getRequestDispatcher("不带工程名的路径").forward(request,response)
重定向:
​        response.sendRedirect("带工程名称的路径")
区别:
1.地址栏:转发地址栏不变,重定向会变
2.请求响应的次数:转发一次请求一次响应,重定向是两次请求和响应
​        如果给request域中存放了数据:转发能够获得到数据,重定向不能获得到数据
3.路径的编写:转发不带工程名,重定向带工程名
4.跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页
Cookie
如何获得:Cookie[] cookies = request.getCookies();
如何向客户端写cookie:response.addCookie(Coookie cookie)
如何创建cookie:Cookie cookie = new Cookie(String name,String value);
​        获得名字:cookie.getName()
​        获得值:cookie.getValue();
​        设置路径:cookie.setPath(String path);
​        设置有效期:cookie.setMaxAge(int age) 单位是:秒
作用范围:默认是一次会话,关闭浏览器就销毁
关于cookie存储中文的问题:

往回写cookie:
String value = URLEncoder.encode("中文", "UTF-8");//"中文"--fadsf%%33
Cookie cookie = new Cookie("aa",value);
response.addCookie(cookie);
获得:
Cookie [] cookies = request.getCookies();
Cookie aa= CookieUtils.findCookie(cookies, "aa");
if(aa!=null){
    String value = aa.getValue();//fadsf%%33--"中文"
    String a = URLDecoder.decode(value, "utf-8");
}Session
如何获得:HttpSession  session  = request.getSession();
作为域对象存取数据
session.setAttribute(String name,Object value);Object vlaue = session.getAttribute(String name);removeAttribute(String name);
范围:一次会话(根本原因:存SesssionID的cookie默认是会话级别的)
配置sessionion过期时间:web.xml

<session-config>
     <session-timeout>5</session-timeout> <!--单位是分钟-->
</session-config>JSP三大指令:
​        page:
​                全局错误友好页面的配置

  <error-page>
    <error-code>404</error-code>
    <location>/404.jsp</location>
  </error-page>
  <error-page>
    <error-code>500</error-code>
    <location>/500.jsp</location>
  </error-page>
​        include:   <%@ include file="" %> 静态包含
        taglib:        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
九大内置对象(面试点三):
    request           HttpServetRequest
    response          HttpServetResponse
    session           HttpSession
    application       ServletContext
    page              Object
    out               JspWriter
    pageContext       PageContext
    config            ServletConfig
    exception         Throwable
技能 拔高点:pageContext:
​        1.获取其他8个内置对象:getXXX()方法
​        2.可以向四个域中存取数据:

pageContext.setAttribute("pname", "pvalue", PageContext.PAGE_SCOPE);
pageContext.setAttribute("rname", "rvalue", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("sname", "svalue", PageContext.SESSION_SCOPE);
pageContext.setAttribute("aname", "avalue", PageContext.APPLICATION_SCOPE);


<%= pageContext.getAttribute("pname", PageContext.PAGE_SCOPE) %>
<%= pageContext.getAttribute("rname", PageContext.REQUEST_SCOPE) %>
<%= pageContext.getAttribute("sname", PageContext.SESSION_SCOPE) %>
<%= pageContext.getAttribute("aname", PageContext.APPLICATION_SCOPE) %>
动作标签:
<jsp:forward page=""> /jsp:forward
<jsp:include page="">/jsp:include :动态包含
静态包含和动态包含的区别(面试点四)
静态包含:相当于源代码的拷贝,只会翻译成一个Java类,有一个执行结果
动态包含:各自分别去翻译,各自执行,最终包含的是执行的结果


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马