鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站制作教程 > JSP > >

(1)javaweb 之 servlet

来源:互联网 作者:佚名 时间:2015-09-23 06:43
Servlet:实现了Servlet接口的类 现在一般extends HttpServlet Servlet请求流程: 浏览器发送http请求给servlet容器/服务器,(如果servlet还没有装入,服务器就装入它) 服务器把request对象给servlet,给每一个请求创建一个执行的新线程 servlet经过处理,
Servlet:实现了Servlet接口的类
现在一般extends HttpServlet
Servlet请求流程:
浏览器发送http请求给servlet容器/服务器,(如果servlet还没有装入,服务器就装入它)
服务器把request对象给servlet,给每一个请求创建一个执行的新线程
servlet经过处理,把reponse对象给服务器,服务器再把http响应给浏览器


servlet的配置:
在web-inf/web.xml文件里面配置
<servlet>
    <servlet-name>XXXServlet</servlet-name>
    <servlet-class>com.xxx.servlet.XXXServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>XXXServlet</servlet-name>
    <url-pattern>/XXX</url-pattern>
  </servlet-mapping>
通过url-pattern的设置,浏览器访问XXX就可以访问到这个servlet
servlet3.0可以通过注解来配置,不需要在web.xml中配置,但是需要tomcat的版本为7.0以上
如:
@WebServlet(description = "login", urlPatterns = { "/LoginDeal" })
public class LoginDealServlet extends HttpServlet{
............
}
其他同样也可以通过注解来配置,如配置过滤器 @WebFilter
不过我还是习惯用web.xml配置,这是病吗


我们现在写一个Servlet一般都extends HttpServlet
这个HttpServlet是extends GenericServlet
而GenericServlet是implements Servlet,ServletConfig
Servlet是一个interface


servlet有很多方法,init,service,destroy
serlvet生命期:init开始,destroy结束
中间调用service,service再去根据get或post请求去调用doGet doPost方法
所以如果我们重写了service方法,它就不会去根据get或post请求去调用了
这里再次说一下servlet的流程:
比如客户端发送一个get请求,给服务器,服务器就根据web.xml或者注解来找到那个servlet
然后servlet去执行init,service(因为这里发送的get请求,再去执行get),最后destroy


通过链接直接点进来就是get请求,表单提交如果写了method="post",就是post请求(表单提交不写默认是get)
这里说一下get请求和post的请求的区别(重要)
GET
请求字符串是URL的一部分,比如www.xxx.com/Login?name=aaa&psw=12345
请求字符串长度有限
可以重新发送相同的URL请求(就是重复刷新)
POST
请求作为HTTP请求体发送
请求字符串长度不限
如果重复刷新,浏览器会发送警告
这里说一下URL中各个符号代表的含义:
问号之后是请求字符串(name=aaa&psw=12345),不同参数用&来分割,参数传入都是String类型,参数无顺序
(后面如果用Struts2的action,url中可能出现叹号,叹号后面代表action中的某个方法,问号之后是一样的)
如果有中文字符,中文字符会URL编码成%33%44这种格式,而空格会变成加号。
服务器端再通过URL解码,把%33%44这种解码成中文(乱码问题下面再说)
servlet中的方法:
request.getQueryString() 比如www.xxx.com/Login?name=aaa&psw=12345,得到的就是问号之后的name=aaa&psw=12345
request.getParameter("name")得到的就是aaa
但是当两个参数名相同时,getParameter("xxx")得到的是第一个xxx参数的值
此时要用getParameterValues("xxx")
以前我学习的时候,看到get和post的区别之一“get是从服务器上获取数据,post是向服务器传送数据。”特别不理解
当然现在也不理解,因为我的理解是这个区别是错的。我的理解是get和post同样都可以传送数据,获取数据,其他区别在前面写了(也许片面,但应该没错误吧)
也可能是因为大家都没按照http规范来。至少http请求中的delete put我就没用过也没见过
搜索了一些资料,有人说“总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送机制不同,并不是一个取一个发!”
跟我的理解是差不多的。所以我看到“get是从服务器上获取数据,post是向服务器传送数据。”就像骂娘,这是击霸啊


cookie和session
cookie是保存在客户端的,也就是电脑硬盘上,与使用哪种浏览器无关,只要电脑还是那个电脑。服务器读取cookie是根据域名的,这样保证了一定的安全性(跨域cookie这里不谈了)
session是保存在浏览器上一个sessionId,session内容保存在服务器。所以浏览器关闭或者换另一个浏览器,或者超时,session都会失效。
session更安全,不过会占用一些服务器资源。
使用方法都很简单,
Cookie:
Cookie[] cookies = request.getCookies();
Cookie是一个有name和value的对象
获取Cookie的具体值:cookies[0].getName(),cookies.getValue()
生成Cookie并放入response:
response.addCookie(new Cookie("name","value"))
会覆盖原有的name为"name"的Cookie
Session:
session的内部具体机制是,如果没有禁用cookie,就用cookie(存放Session ID),否则改写URL
每个Session ID都是唯一的
url地址重写:
就是在原有的URL后面,加 ;jsessionid=xxxxxxx(即路径参数)
;后对于getParameter()方法是不可见的
改写的方式,是不是可以改写sessionid,session是不是也不是绝对安全
session可以放对象:
request.getSession().setAttribute("user",new User("aaa",12345));


重定向和转发:
request.getRequestDispatcher("xxx.jsp").forward(request, response);//转发
response.sendRedirect("xxx.jsp");//重定向
区别:
重定向对浏览器可见,转发对浏览器不可见 (比如LoginDeal转发到xxx.jsp,url还是LoginDeal,重定向就是xxx.jsp)
重定向之后,即使request还叫request,但它已经不是原来的request了


重复刷新提交问题:
1 使用重定向。但是request中的内容丢失了。
2 不想丢失怎么办,token机制:在session中放一个token。提交时,从session取得这个token并提交;提交处理时,每次在servlet中处理的时候拿出session中的token和提交过来的token比对,
如果不相同,不处理,或者返回一个错误;如果相同,证明不是重复提交,这时候更新session中的token。这个token可以是当前时间的毫秒数,也可以是上一次数字+1,见仁见智。


乱码问题:
post和get的处理方式是不同的,原因,上面写过post和get的区别,get是附在url上,post是附在请求体上,所以处理方式也不同。
乱码也有两种,网页前端显示乱码,java后台输出乱码。
post的话很简单,请求设置request.setCharacterEncoding("UTF-8");这样后台输出就不是乱码,只对post有效
后台处理参数response.setContentType("text/html; charset=UTF-8");这样控制浏览器用utf-8解码,传给前台就不是乱码
get的话,因为IE和WEB服务器之间不能传输文本,然后就通过ISO-8859-1进行编码,
所以String content = new String(request.getParameter("content").getBytes("ISO-8859-1"), "UTF-8");
把ISO-8859-1编码的字符串重新编码成utf-8格式就可以了。


过滤器:
需要实现Filter接口,接口中有3个方法init doFilter destroy
FilterConfig 封装了Filter的初始化信息
FilterChain 过滤器链,责任链模式
(如果后面用struts2,这个框架本身实现了很多过滤器,基本不用自己写过滤器了,但是配置还是要配)
配置也有两种方法,web.xml或注解。和servlet的配置差不多
当配置多个Filter到web.xml中,会自动形成一条链(责任链模式),根据配置顺序依次执行
这里我有一点不理解,就是FilterChain是怎么生成的,我认为是根据url-pattern,把匹配到的Filter按照配置的顺序加到chain中
url-pattern中 /*和具体的xxx.jsp是平级完全相等的,就是根据配置的上下顺序
比如配置中最上面是/* ,第二个是login.jsp
当访问login.jsp时,会生成一条链,顺序是:/*过滤器和login.jsp过滤器
当访问其他的jsp时,也会生成一条链,不过这条链上只有一个过滤器,就是/*
但是如果过滤器中有跳转或转发操作,行为就不同了。
跳转或转发会中断过滤器链(我的测试结果证明这点)
就是比如/*过滤器是跳转到login.jsp,同时又有about.jsp的过滤器,
当url为about.jsp时,会先执行/*过滤器的跳转到login.jsp动作,随后about.jsp的过滤器会不执行
当/*过滤器没有跳转动作时,执行顺序是/*过滤器,about.jsp过滤器
每次跳转都会生成新的过滤器链。
过滤器就说这么多吧


下期预告:
在servlet中out.println HTML代码是及其痛苦的技术,于是产生了JSP。
有了JSP,就可以充分发挥两者的优点,用JSP来展示,用servlet来控制。
jsp的访问顺序是,如果xxx.jsp是第一次访问,则生成xxx_jsp.java文件,然后生成xxx_jsp.class字节码

所以第一次访问jsp的时候会很慢,之后的访问会很快。


用到的代码:

http://pan.baidu.com/share/link?shareid=440140&uk=2936528950

网友评论
<