美文网首页
web 学习笔记Servlet一 day1-day3

web 学习笔记Servlet一 day1-day3

作者: 明明找灵气 | 来源:发表于2016-11-08 14:42 被阅读0次

    一. eclipse创建web工程

    1. 新建工程
    2. 添加flod文件夹,命名WEB-INF
    3. WEB-INF中添加classes文件夹、lib文件夹和web.xml文件
    4. 修改字节码文件输出路径为WEB-INF/classes。项目-属性-Java Build Path-source

    (一)intellij idea 创建web工程

    1. new project-java-java EE-webapplication,填写项目名
    2. 右键项目名,open module setting- sources选择WEB-INF 快捷键commadn+N 新建文件夹classes和lib;Paths输出路径为新建的classes;dependencies “+” -1 jar-lib文件夹,“+”-2library 选择tomacat包
    3. tomcat配置。 run-edit configurations- ‘+’-选tomcat-local,
      server标签页第一次需要导入tomcat路径,之后不需要。Deployment-"+" 添加工件,application context可以添加上下文名称,回到server标签页,on "update" action和 on frame deactivation 都选update classes and resource,
      有时端口被占用,改下2个端口号

    二. HTTP协议

    1. 规定数据传输格式。
    2. HTTP1.0规范,多次请求资源,需建立多次连接,发送多次请求和接收多次响应,关闭多次连接。
    3. HTTP1.1规范,一次连接可以多次请求和响应,一次关闭。
    4. HTTP消息结构:一个请求行、若干请求头和实体内容,一些请求头和实体内容可选,后2者之间用空行隔开
      <1>Accept:mime类型
      <2>Accept-Charset:支持的字符集
      <3>Accept-Encoding:编码方式
      <4>Accept-Language:支持的语言
      <5>Referer:当前页面由哪个页面访问过来
      <6>Content-Type:请求正文的mime类型
      <xxx>

    三. Helloservlet

    1. 右键项目中src文件夹,新建包
    2. 右键新建的包,新建java类文件
    3. 新建的公共类继承HttpServlet 报错,根据提示导入包,再导入接口的抽象方法

    四. Servlet请求流程

    1. 浏览器发送请求,地址链接http://主机ip/上下文路径/资源名称
    2. 服务器解析,从server.xml中找到上下文路径匹配的Path,当前项目根路径下/WEB-INF 找到web.xml,找到和资源名称匹配的Servlet类的全限定名称,有个映射过程。
    3. 反射机制创建Servlet对象
    Servlet obj = Class.forName("全限定类名").newInstance();
    
    1. 创建ServletConfig对象,使用Servlet对象调用init方法,
    obj.init(config);
    
    1. 创建req和resp对象,并调用service方法,
    obj.service(req,resp);
    
    1. 在service方法中给浏览器做响应
      特点:非第一次请求过程,步骤1,2后,http无状态,但是有缓存,故可从Servlet实例池中取出Servlet对象,5,6

    五. 表单输入,后台乱码问题

    首选解决方法:在Run-Edit configurations-Startup/Connection 中Run中添加environment variables
    JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8.

    1. 表单方法为post时,可以在获取参数之前设置字符编码格式
    req.setCharacterEncoding("UTF-8");
    

    但是必须在获取所有参数中任意一个参数的语句之前

    1. 表单方法为get时,目前测试没问题,有问题的话是因为默认编码格式是ISO-8859-1,先获取参数,然后用该格式解码,再用UTF-8格式编码
    String age = req.getParameter("age");
    byte[] data = age.getBytes("ISO-8859-1");
    age = new String(data,"UTF-8");
    

    (eclipse)或者修改tomcat的配置文件server.xml,修改其中端口那一行

     <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

    修改为

     <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
                   URIEncoding="UTF-8"
    

    URIEncoding缺省情况下,为"ISO-8859-1"的编码格式

    六. 配置文档和注解

    1. 配置文档
    <?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"         version="3.1" metadata-complete="false"> 
    <!--是否忽略注解-->   
    <servlet>        
        <servlet-name>MappingServlet</servlet-name>       
       <servlet-class>com.txm._01_mapping.MappingServlet</servlet-class>        
    <init-param>            
    <param-name>encoding</param-name>           
     <param-value>UTF-8</param-value>        
    </init-param>       
     <load-on-startup>0</load-on-startup>    
    </servlet>    
    <servlet-mapping>        
    <servlet-name>MappingServlet</servlet-name>        
    <url-pattern>/map2</url-pattern>    
    </servlet-mapping>    
    <servlet-mapping>        
    <servlet-name>MappingServlet</servlet-name>        
    <url-pattern>/map1</url-pattern>    
    </servlet-mapping>
    </web-app>
    
    1. 注解
    @WebServlet(value="/map",loadOnStartup = 0,initParams = @WebInitParam(name="encoding",value="UTF-8"))
    
    1. 比较
      (1). 从开发角度:注解简单
      (2). 从维护角度上:注解维护困难,使用注解又把硬编码再次拉回到代码中
      开发中:通用配置一般使用xml完成,维护性好,清晰,特殊配置,使用注解。
      在web中,和其他框架做集成,就只能用配置方式。

    七. Servlet线程不安全问题

    Servlet优点:动态网页,跨平台的,单例的(速度快)
    缺点:多线程并发Servlet线程不安全,输出界面不友好
    根本原因:多个线程并发访问同一份资源
    解决方案:不要使用成员变量,单例情况下,若网络延迟,成员变量赋值再读取,可能读到的不是自己赋的值。

    八. Cookie,客户端共享数据的技术,参数传递,会话跟踪。

    1. 作用把需要共享的信息,保留在客户端(浏览器)中。不同于在链接中直接传递参数,信息出现在地址栏,不安全。但是依然可以利用开发工具查看set-Cookie信息。
    2. 语法
      当前回话需要设置cookie,响应添加cookie,此次回话过程中,访问只要获取cookie,响应不需要再次添加cookie。
    //LoginServlet.java
    Cookie c = new Cookie("username",username);
    resp.addCookie(c);
    //ListServlet.java
    Cookie[] c = req.getCookie();//获取的是Cookie数组
    String username = c[i].getValue();
    
    1. Cookie不支持中文和安全性
      利用加密和解密方式,同时解决上诉两个问题
    //LoginServlet.java
    Cookie c = new Cookie("name", URLEncoder.encode(username,"UTF-8"));
    req.addCookie(c);
    //ListServlet.java
    Cookie[] c = req.getCookie();//获取的是Cookie数组
    String username = URLDecoder.decode(c[0].getValue());
    
    1. Cookie 路径和域
      整个应用可用 c.setPath("/");
      多个二级域名可用c.setDomain(".baidu.com");

    九. Session服务器端的数据共享技术,不使用会话跟踪

    1. 服务器器开辟一个空间存储客户端信息,响应时传回这个Session的id给浏览器,浏览器下次访问时,再传回这个id,用于识别认证,服务器就可以根据这个id取出数据。
    2. 操作
    //1.获取或创建session
    HttpSession session = req.getSession();
    //2.把共享数据存储在Session中,键值对形式 
    //session.setAttribute(String name, Object value);
    session.setAttribute("username","will");
    //3.从session中取出共享数据
    Object val = session.getAttribute("username");
    //4.修改session中的共享数据
    //重新设置一个同名的属性名
    session.setAttribute("username","tom");
    //5.删除知道属性值
    session.removeAttribute("username");
    //6.拓展
    User user = new User("name","password");
    session.setAttribute("User_in_Session",user);//习惯名字为"XXX_In_Session"
    /*习惯把放入Session的对象(User类),让它实现序列号接口,则当多台服务集群的时候,彼此之间可以共享session数据。序列化,对象转为二进制,反序列化则是把二进制数据恢复成对象,二者都是对象流。
    */
    

    . 销毁Session对象(退出,注销登录)
    操作中的删除方法只能删除一个指定名称的属性
    session.invalidate();销毁整个Session对象

    ----------------分割线-------------------

    相关文章

      网友评论

          本文标题:web 学习笔记Servlet一 day1-day3

          本文链接:https://www.haomeiwen.com/subject/babauttx.html