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、不希望影响界面,同时要使用该数据
数据库验证