web 学习笔记Servlet一 day1-day3

一. 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对象

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • 这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答...
    杂货铺老板阅读 1,397评论 0 10
  • 一 servlet概述 狭义的Servlet指javax.servlet包中的一个接口,而广义的Servlet则是...
    静慎独阅读 448评论 0 0
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,178评论 11 349
  • 缘起 早些时候看到六哥在简书召唤他的朋友们,当时蠢蠢欲动,但发现360不是个小数目啊,于是作罢,但这个事儿并...
    消弭之音阅读 202评论 0 0
  • 关于诉说儿女情长的文章太多,读的多了就渐渐有了抵抗力,曾经的一读泪流满面到如今的略略一思,世界很大,故事很多,当每...
    吃碗红豆沙阅读 353评论 0 0