java 之servlet

来源:互联网 发布:王军税务总局调离知乎 编辑:程序博客网 时间:2024/05/23 14:45
 servlet

              servlet是通过“请求-响应”编程模型来访问的应用程序。虽然servlet可以对任何类型的请求产生响应,
但通常只用来扩展Web服务器的应用程序, 可以生成动态的Web页面。 是由包含Java虚拟机的Web容器进
行加载,根据请求,响应模型来运行。
               
           Servlet工作流程

 (1)客户机将请求发送到服务器。

 (2)服务器上的Web容器实例化(装入)Servlet

 (3)Web容器将请求信息发送到 Servlet。

 (4)Servlet 创建一个响应,并将其返回到Web容器

 (5)Web容器将响应发回客户机。

 (6)服务器关闭或Servlet空闲时间超过一定限度时   调用destory()方法退出。

           Servlet生命周期

     服务器加载servlet->服务器创建servlet类实例 ->调用servlet实例的init()方法-> 收到请求 ->  调用service()方法

->service()方法处理请求并将输出结果返回客户端->    servlet等待下一个请求或由服务器卸载 ->  servlet在服务器调用

destroy()方法后被卸载

下面用servlet的接口httpservlet编程查看servlet的工作流程新建一个httpservlet 

public class Servler extends HttpServlet {
public void destroy() {
super.destroy();
System.out.println("dodestory...");
}


public void init() throws ServletException {
super.init();
System.out.println("doinit...");
}


private static final long serialVersionUID = 1L;
       
    public Servler() {
        super();
    }


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doGet...");
}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost...");
}
}

在web.xml文件配置他的访问路径

 <servlet-name>Servler</servlet-name>
    <servlet-class>servlers.Servler</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Servler</servlet-name>
    <url-pattern>/Servler</url-pattern>
  </servlet-mapping>

然后我通过post方法访问,在服务器中得到

可见是先调用init()方法,在调用service()方法,执行完毕后,并未马上销毁,而是等待下一次的连接

servlet中还有两个重要的东西servletRequest和servletResponse

servletRequest为Servlet所发送的请求,用ServletRequest封装常用子接口HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,所发出的HTTP请求消息被封装在
此对象之中,通过这个对象提供的方法,即可获得客户端发出的请求信息。
比如 request.getParameter("传递的参数名");是获得相应名的数据,如果有重复的名,则返回第一个的值 . 接收一般变量 ,如text类型
request.getParameterValues(String   name)是获得如checkbox类(名字相同,但值有多个)的数据

servletResponse为Servlet对客户段所做的响应
getWriter():获取PrintWriter输出流给客户发送的响应内容
setContentType:设置响应内容的响应类型和字符集信息
sendRedirect:设置重新请求路径
子接口HttpServletResponse

一般做web开发HttpServletRequest和HttpServletResponse用的比较多


在进行处理之前先学习Get和Post方法参数的传递方式

GET方式下,URL地址后的附加信息
GET方式传递参数的形式
浏览器在URL地址后以“?”形式带上数据,多个数据之间以&分隔
http://localhost:8080/MyApp/myServlet?name1=value1&name2=value2

POST方式下,HTTP请求消息中的实体内容部分
POST方式:
<form>表单method属性设置为“post”,提交表单时生成的HTTP请求方式
Content-Type:application/x-www-form-urlencoded此句为post方式头部中必须加的一句话
POST方式传递参数的形式作为请求消息的实体内容部分进行传送

下面在doGet()方法和doPost()方法中对数据进行处理,然后用get方式和post方式请求
首先用post方法
先在doPost()方法中加入如下代码
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost...");
String name=request.getParameter("name");
String age=request.getParameter("age");
System.out.print("name="+name+"age="+age);
String str="hello post";
response.setContentType("text/html");  
response.setCharacterEncoding("utf-8");  
response.getWriter().write(str);  
}
然后编程实现连接,并处理回传的数据
public class HttpTomact {
public static void main(String[] args) {
String str="name=zhang&age=12";
StringBuffer ab=new StringBuffer();
ab.append("POST /first/Servler HTTP/1.1\r\n");
ab.append("Host: localhost:8080\r\n");
ab.append("Accept-Language: zh-cn\r\n");
ab.append("Content-Type: application/x-www-form-urlencoded\r\n");
ab.append("Content-Length: "+str.length()+"\r\n");
ab.append("Connection: close\r\n");
ab.append("\r\n");
ab.append(str);
Socket sb;
try {
sb = new Socket("localhost",8080);
OutputStream bos=sb.getOutputStream();
bos.write(ab.toString().getBytes());
InputStream bis=sb.getInputStream();

BufferedReader br=new BufferedReader(new InputStreamReader(bis),1024);
String res=br.readLine();
while(res!=null){
System.out.println(res);
res=br.readLine();//此处是一行一行读回传的数据,并输出
}
bos.flush();
bos.close();
bis.close();

} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
服务器的输出结果
可见是获取到了传过来的值
回传的结果

可见回传成功
get的方法和post差不多,服务器端只需把刚才post中处理的方法放到doGet()方法中即可
然后在请求的代码中使用get方法请求,只需修改请求的头部,其他的代码不变,修改部分如下:
//String str="name=zhang&age=12";
StringBuffer ab=new StringBuffer();
ab.append("GET /first/Servler?name=zhang&age=12 HTTP/1.1\r\n");
ab.append("Host: localhost:8080\r\n");
ab.append("Accept-Language: zh-cn\r\n");
//ab.append("Content-Type: application/x-www-form-urlencoded\r\n");
//ab.append("Content-Length: "+str.length()+"\r\n");
ab.append("Connection: close\r\n");
ab.append("\r\n");
//ab.append(str);
结果如下:



0 0
原创粉丝点击