Servlet学习笔记--Servlet初步
lamp:linux + apache + mysql + php 不花钱黄金组合
1.tomcat初步
设置环境变量java_home:jdk目录--否则无法启动startup.bat
修改conf/server.xml文件中的
<connector port="8080" protocol="http/1.1"
connectiontimeout="20000"
redirectport="8443" />
表示tomcat占用的端口号
修改conf/context.xml文件中的
<context reloadable="true">
如果有更新,自动加载
2.http初步
安装 httplook
手动发送请求到服务器
若要通过http协议访问网络资源,规定的请求开头格式:
get /latest.html http/1.1
host:
content-type: text/html
{空行}
------------------testhttp.java
[java]
public class testhttp {
public static void main(string[] args) throws exception {
socket s = new socket("127.0.0.1", 8080);
bufferedwriter bw = new bufferedwriter(new outputstreamwriter(s.getoutputstream()));
bw.write("get / http/1.1");//get方式连接服务器,'/'访问根目录下的文件,'http/1.1'基于什么协议
bw.newline();
bw.write("host: 127.0.0.1:808");//因为一个ip下面可能管理多个域名,所以要指明ip地址下的哪个域名
bw.newline();
bw.write("content-type: text/html");//指明访问的资源类型
bw.newline();
bw.newline();//必须有个空行,表明请求结束
bw.flush();
bufferedreader br = new bufferedreader(new inputstreamreader(s.getinputstream()));
string str = null;
while((str = br.readline()) != null) {
system.out.println(str);
}
bw.close();
br.close();
s.close();
}
}
----------------------
3.第一个servlet
必须有个web-inf文件夹,如下
web-inf
web.xml
该web app的配置文件
lib
该web app用到的库文件
classes
存放编译好的servlet
导入api:
项目-右键-properties - java build path - libraries - add external jars :e:\apache-tomcat-7.0.27-windows-x64\apache-tomcat-7.0.27\lib\servlet-api.jar
[java]
------------------------helloservlet.java
import java.io.ioexception;
import java.io.printwriter;
import javax.servlet.servletexception;
import javax.servlet.http.httpservlet;
import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
public class helloservlet extends httpservlet{
private static final long serialversionuid = 1l;
@override
protected void dopost(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception {
printwriter pw = resp.getwriter();
pw.write("hello servlet!--dopost");
pw.flush();
pw.close();
}
@override
protected void doget(httpservletrequest req, httpservletresponse resp)
throws servletexception, ioexception {
//解决中文乱码
resp.setcontenttype("text/html;charset=gbk");
printwriter pw = resp.getwriter();
pw.write("你好hello servlet!--doget");
pw.flush();
pw.close();
}
}
---------------------------
配置步骤:
把编译好的helloservlet.class拷到web_inf/classes
如果这个类在eclipse中被包裹着,那么classes文件夹下面也要新建对应的文件夹
例如:helloservlet这个类是在ls/per包下面,则在classes下新建ls文件夹,在ls文件夹下面新建per文件下,per下面存放helloservlet.class
修改web.xml
[html]
<?xml version="1.0" encoding="iso-8859-1"?>
<web-app xmlns=""
xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:schemalocation=""
version="2.5">
<servlet>
<servlet-name>helloservlet</servlet-name>//servlet的名称
<servlet-class>helloservlet</servlet-class>//class文件的目录d,完整包路径,如果class是放在包里面的,就要这样写"ls.com.helloservlet"
</servlet>
<servlet-mapping>
<servlet-name>helloservlet</servlet-name>//servlet的名称,必须与上面的一致
<url-pattern>/hs</url-pattern>//url访问地址,‘/’表示“http://127.0.0.1:8080/web应用目录”+/hs 才能访问到这个servlet
</servlet-mapping>
</web-app>
4.servlet生命周期
从始至终只有一个servlet对象,以多线程的形式处理客服端请求
第一个客服端请求调用servlet时,被实例化,调用servlet类的构造方法,只调用一次
接着调用初始化方法init()做些前奏准备,只调用一次
web应用程序退出时或者类的定义发生变化时,调用destroy()方法处理善后
5.中文乱码问题
必须在取字符之前调用
返回响应字符处理:response.setcontenttype("text/html;charset=gbk");
接受post请求字符处理:request.setcharacterencoding("gbk");
接受get请求字符处理:修改conf--server.xml--修改端口的地方--加上 uriencoding="gbk"
6.为什么有两个init()方法
init()
init(servletconfig config)
为了避免重写init(servletconfig config)时,忘了调用父类的init()方法,导致参数初始化错误,所以写个空的init()方法,重写时调用这个空的init()方法
摘自 沐子松