Servlet之路


IDE(eclipse[ java se] +myeclipse [ 插件  可以支持jsp/servlet/struct/spring/hibernate....])
 response.setCharacterEncoding("utf-8"); 防止中文乱码
response.setContentType("text/html;charset=utf-8"); //直接告诉浏览器以什么编码格式编译
 response.setCharacterEncoding(this.getServletConfig().getInitParameter("encoding")); //从配置文件中获取编码格式
文件改名要慎重,因为配置文件中还是用的原来文件名
form中的action应该这样写      /web应用名/Servlet的url

servlet提供了两种页面跳转的方式  Sendredirect     转向      forward     转发
sendRedirect的url格式: /web应用名/servlet url

可以使用a实现页面跳转  href格式为:/web应用名/servlet url

Tomcat原理

import java.net.*;
import java.io.*;
public class test {
       public static void main(String []args) throws Exception{
             ServerSocket ss = new ServerSocket(9999);
             while(true){
             Socket s = ss.accept();
             System.out.println("在9999等待连接....");
             OutputStream os = s.getOutputStream();
             BufferedReader br = new BufferedReader(new FileReader("d:\\hello.html"));
             String buf = "";
             while((buf = br.readLine())!=null){
                    
                    os.write(buf.getBytes());
             }             
             br.close();
             os.close();
             s.close();
             }
       }
}

浏览器会缓存近期访问网站获取的文件。当你再次访问相同的网站时,浏览器会先判断是否有缓存,有的话直接取,没有的话再访问

端口被占用
查看端口占用情况
netstat -an
netstat -anb
netstat -ano
用任务管理器关闭占用端口的进程

更改需要的端口号
conf\server.xml
<Connector connectionTimeout="2000" port="8080"/>(20秒就超时,端口号为8080)

tomcat的目录结构
bin:启动和关闭comcat的bat文件
conf:配置文件
     server.xml:该文件用于配置和server相关的信息,比如tomcat启动端口后,配置Host,配置Context即           web应用
         web.xml:该文件配置与web应用(web应用就相当于是一个web站点)
         tomcat-user.xml:该文件用户配置tomcat的用户密码和权限
lib目录:该目录防止运行tomcat运行需要的jar包
logs目录:存放日志,当我们需要去查看日志的时候,很有用
webapps目录:该目录下,放置我们的web应用(web站点)
work工作目录:该目录用于存放jsp被访问后 生成的对应的server文件 和.class文件

配置的代码是 web.xml 文件中添加:
                                                       <welcome-file-list>
                                                            <welcome-file>hello.html</welcome-file>
                                                       </welcome-file-list>

web-inf目录下的 classes 目录将来是存放 class文件
web.xml 配置当前这个web应用的信息



在C:windows/system32/drivers/etc 下的host文件
在tomcat的server.xml里面添加一个主机名

Servlet基础知识
servlet是用纯java写的程序,运行在服务器端,几乎可以完成网站所有的功能,是jsp的基础,被web服务器管理









<!--根据servlet规范,需要将Servlet部署到web.xml文件,该部署配置可以从examples下拷贝-->
<servlet>
     <!--servlet-name 给该Servlet取名,该名字可以自己定义:默认就使用该Servlet的名字-->
     <servlet-name>MyHttpServlet</servlet-name>
     <!--servlet-class要指明该servlet放在哪个包下,形式是包/包/../类-->
     <servlet-class>com.lch.MyHttpServlet</servlet-class>
</servlet>
     <!--Servlet的映射-->
<servlet-mapping>
     <!--这个Servlet-name要和上面的servlet-name名字一样-->
     <servlet-name>MyHttpServlet</servlet-name>
     <!--url-pattern 这里就是将来访问该Servlet的资源名部分,默认命名规范:就是该Servlet的名字-->
     <url-pattern>/MyHttpServlet</url-pattern>
</servlet-mapping>

当编译器找不到servlet包

解决办法:

从tomcat lib目录下拷贝一个servlet-api.jar的包到“JDK\jre\lib\ext”目录下

凡是出现找不到包的情况,都可以将找到的包放到JDK\jre\lib\ext下,然后再编译就能够通过


一个注册好的servlet可以被多次映射



在匹配的时候,要参考的标准是:
     (1)看谁的匹配度高,谁就被选择
      (2)*.do的优先级最低

防止中文乱码问题
     response.setCharacterEncoding("utf-8");

Servlet单例问题
当Servlet被第一次访问后,就被加载到内存,以后该实例对各个请求服务。即在使用中是单例

因为Servlet是单例,因此会出现线程安全问题:比如:
售票系统.如果不加同步机制,则会出现问题:
原则:
     (1)如果一个变量需要多个用户共享,则应当在访问该变量的时候加同步机制
               synchronized(对象){//同步代码}
      (2) 如果一个变量不需要共享,则直接在doGet()或者doPost()中定义



servlet中的<load-on-startup>配置
需求:当我们的网站启动的时候,可能会要求初始化一些数据,(比如创建临时表)
     再比如,我们的网站有一些要求定时完成的任务[定时写日志,定时备份数据库...定时发送邮件]
     解决方法:可以通过<load-on-startup>配合 线程知识搞定

先说明<load-on-startup>:通过配置<load-on-startup>我们可以指定某个Servlet自动创建
<!--1表示被init()顺序-->
<load-on-startup>1</load-on-startup>


在这里配置的信息只供该servlet读取

如果这里配置的参数可被所有的servlet读取

深度剖析Http协议
超文本传输协议
工作在tcp/ip协议基础上的

通过httpwatch插件来抓取http请求内容
http1.0短连接  http1.1长连接  目前通用的是1.1版本
http是TCP/IP协议的一个应用层协议,http也是我们web开发的基础


request.getHeader("Host");

Referer:可通过它来判断来自哪里
从本网站过来才有值,超链接过来没有值
referer==null||!referer.startsWith("http://localhost:8080/servletPro");
功能:允许本网站的用户才能访问该servlet文件




200:请求和响应没有发生错误
302:表示当你请求一个资源的时候,服务器返回302表示让浏览器转向另外一个资源
404:表示找不到资源
500:服务器端错误








sendRedirect()的使用
需求:当用户登录成功后,把该用户名字显示再登录成功页面

解决思路
               1、使用java基础  static
               2、使用sendRedirect()
               3、使用session传递信息
                    既可以传字符串也可以传对象

               4、使用request的转向
                    转向是在web服务器发生的
                    两个页面使用的是同一个request和response对象

1、使用forward不能转向到该web应用外的url
2、因为forward是发生在web服务器,所以Servlet1和Servlet2使用的是同一个request和response
使用sendRedirect()方法不能通过request.setAttribute()把属性传递给下一个Servlet

面试题:
     请问  sendRedirect()和forward区别是什么
答:
(1)叫法不同,sendRedirect()叫重定向,转发     forward()叫转向
(2)实际发生的位置不一样     
          sendRedirect发生在浏览器
          forward发生在web服务器
(3)用法不一样
          request.getRequestDispatcher("/资源URI").forward(request,response)
          response.sendRedirect("/web应用/资源URI")
(4)能够去的URL不一样
          sendRedirect可以去任何URL
          forward只能去当前的WEB应用资源

怎样算是一次http请求
只要没有停止,也没有回到浏览器重定向,就算一次(无论走了多少的servlet)
无论转向多少次,浏览器的地址栏一直都保存在最开始的URL

说明:
     基本格式
     response.sendRedirect("servlet的地址?参数名=参数值&参数名=参数值....")

     在接收数据的servlet中:
     String 参数 = request.getParameter(参数名);
     参数值是string,不能穿对象。参数名应该避免中文,最好按照规范命名



中文乱码专题

发生乱码有三种情况

① 表单 form
(1)post
  解决方法:     request.setCharacterEncoding("utf-8");     //gbk gb2312
(2)get
  解决方法:     String u = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
(最好写成一个工具类)
② 超链接
<a href="http://www.sohu.com?name="林">测试</a>
超链接提交本质是get提交
③ sendRedirect()发生乱码
response.sendRedirect("servlet地址?username=林");

response细节

HttpServletRequest常用方法
request.getQueryString();
该函数可以获取请求部分的数据,就是请求头?后面的所有内容
 


在下载的时候中文文件名变成乱码

如果接受的是单个内容,使用     String sex = request.getParameter("sex");

如果接受复选框的内容,则使用getparameterValues
String [  ] hobbies = request.getParameterValues("hobby");

防止遍历数组出错

什么时候使用hidden传输数据
     1、不希望用户看到该数据
     2、不希望影响界面,同时要使用该数据



数据库验证











































































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏洛克·林

有钱的捧个钱💰场或人场~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值