第2,8章 servlet 开发技术(12课时)

第2章 servlet开发技术

Servlet是什么

servlet是基于java语言的web服务器端编程技术。按照一定规则定义的java类。他有约定好的一些方法。get post init destroy

servlet作用

无论是get/post方法都至少有两个参数,一个叫HttpServletRequest(请求对象),一个叫HttpServletResponse(响应对象)
他对外暴露一个地址,可以用于页面访问的。

servlet如何创建和定义

有两种创建方式servlet2.5以前半自动创建 (.java+web.xml)
servlet2.5注解方式创建 (
.java+注解)

第一种方式:servlet2.5以前是手动创建

1)写一个servlet类(java)继承HttpServlet

public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doPost(req, resp);
    }

}

2)web.xml里配置对外暴露的地址。
web.xml在WebContent\WEB-INF\web.xml

 <servlet>
 <servlet-name>TestServlet</servlet-name>
 <servlet-class>com.neuedu.javaweb.chap02.TestServlet</servlet-class>
  </servlet>
 <servlet-mapping>
 <servlet-name>TestServlet</servlet-name>
 <url-pattern>/test.do</url-pattern>
 </servlet-mapping>

servlet3.0自动创建

包名-new -servlet-输入servlet文件名称-下一步-urlmapping里可以更改映射地址-finish

@WebServlet("/regServlet")
public class RegServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
/**
 * @see HttpServlet#HttpServlet()
 */
public RegServlet() {
super();
// TODO Auto-generated constructor stub
}

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        System.out.println("doGet被调用");
        response.getWriter().append("Served at: ").append(request.getContextPath());
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(request, response);
    }

}

servlet生命周期关键方法

init()初始化方法
service()服务方法
doGet()
doPost()
......根据method不同,service将请求分发到不同方法
destory()销毁方法

注意:init()和destory()方法整个生命周期中只执行一次。service等方法可以执行多次

初始化带参数以及init里获取参数

@WebServlet(value="/regServlet",initParams={@WebInitParam(name="driver",value="com.mysql.jdbc.Driver"),
        @WebInitParam(name="userName",value="root"),
        @WebInitParam(name="passWord",value="root")}
)
public class RegServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
/**
 * @see HttpServlet#HttpServlet()
 */
public RegServlet() {
super();
// TODO Auto-generated constructor stub
}

    

    @Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println(config.getInitParameter("userName"));
        super.init(config);
    }



    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    System.out.println("doGet被调用");
    //response.getWriter().append("Served at: ").append(request.getContextPath());
    PrintWriter out=response.getWriter();
    out.println("success");
}

/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // TODO Auto-generated method stub
    doGet(request, response);
}

}

注册程序

新建包 com.neuedu.service com.neuedu.service.impl  com.neuedu.dao 

com.neuedu.dao.impl
目录结构如图


image.png
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册页面</title>
</head>
<body>
注册页面<br>
<form action="regServlet" method="post">
账号:<input type="text" name="username"/><br>
密码:<input type="password" name="password"/><br>
爱好:<input type="checkbox" name="hobby" value="1">打篮球
<input type="checkbox" name="hobby" value="2">踢足球
<input type="checkbox" name="hobby" value="3">烫头
<input type="submit" value="注册"/>
</form>
</body>
</html>

servlet

package com.neuedu.javaweb.chap02;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class RegServlet
 */
@WebServlet(value="/regServlet",initParams={@WebInitParam(name="driver",value="com.mysql.jdbc.Driver"),
        @WebInitParam(name="userName",value="root"),
        @WebInitParam(name="passWord",value="root")}
)
public class RegTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
   
/**
 * @see HttpServlet#HttpServlet()
 */
public RegTestServlet() {
super();
// TODO Auto-generated constructor stub
}

    

    @Override
    public void init(ServletConfig config) throws ServletException {
        // TODO Auto-generated method stub
        System.out.println(config.getInitParameter("userName"));
        super.init(config);
    }



    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
        
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("doPost方法被调用");
        //获取前台输入的信息
        String name=request.getParameter("username");
        String password=request.getParameter("password");
        //checkbox数据
           String[] hobbys=request.getParameterValues("hobby");
          //打包user
    User user=new User();
    user.setUserName(name);
    ......
    //调用service进行处理
    IUserService userService=new UserServiceImpl();
    int i=userService.addUser(user);
    //返回处理结果
    response.setContentType("text/html;charset=utf-8");
    PrintWriter out=response.getWriter();
    if(i>0){
        out.println("success");
    }else{
        out.println("failure");
    }
    }
}

解决中文乱码问题

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=UTF-8");

request里能获取什么

应用程序上下文 request.getContextPath()
客户端ip request.getRemoteAddr()
客户端端口 request.getRemotePort()
本地地址 request.getLocalAddr()
相对路径 request.getRequestURI()
请求方式 request.getMethod()
头信息(了解,是枚举类型)
request.getHeaderNames()

    //上下文路径
    System.out.println("应用程序上下文"+request.getContextPath());
            System.out.println("客户端ip"+request.getRemoteAddr());
            System.out.println("端口"+request.getRemotePort());
    System.out.println("本地addr"+request.getLocalAddr());
    System.out.println("相对路径"+request.getRequestURI());
    System.out.println("请求方式"+request.getMethod());
    //以下了解
    System.out.println(request.getHeaderNames());
    Enumeration<String> headers=request.getHeaderNames();
    while(headers.hasMoreElements()){
        String key=headers.nextElement();
        String value=request.getHeader(key);
        System.out.println("key--->"+key);
        System.out.println("value--->"+value);
        
    }

打印结果:

应用程序上下文/myproject
客户端ip0:0:0:0:0:0:0:1
端口51784
本地addr0:0:0:0:0:0:0:1
相对路径/myproject/loginServlet
请求方式POST
org.apache.tomcat.util.http.NamesEnumerator@3c32a826
key---->host
value-->localhost:8081
key---->connection
value-->keep-alive
key---->content-length
value-->31
key---->cache-control
value-->max-age=0
key---->origin
value-->http://localhost:8081
key---->upgrade-insecure-requests
value-->1
key---->content-type
value-->application/x-www-form-urlencoded
key---->user-agent
value-->Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.16 Safari/537.36
key---->accept
value-->text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
key---->referer
value-->http://localhost:8081/myproject/login.html
key---->accept-encoding
value-->gzip, deflate, br
key---->accept-language
value-->zh-CN,zh;q=0.9
key---->cookie
value-->Webstorm-a327319a=cc9d0535-8c62-45c6-91d2-ba803bc9a72d

转发和重定向

转发:只发一次请求 地址栏的地址不变 只能转发到内部地址 效率高 request转发 request可以带参数
重定向:两次请求 地址栏地址会变化 可以请求外部地址 效率低 responset重定向 只能在url地址里带参数(如果重定向到的页是用html的IFRAME开发的,只能用redirect)
应用技巧:
如果请求外部地址或者跳转时不需要携带原始请求用重定向。否则用转发
重定向时加上上下文路径

response.sendRedirect(request.getContextPath()+"/user/index.html");

转发写法

request.getRequestDispatcher("/login.html").forward(request, response);

代码详见第2章代码样例(注册登录)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • IOC 控制反转容器控制程序对象之间的关系,而不是传统实现中,有程序代码之间控制,又名依赖注入。All 类的创建,...
    irckwk1阅读 922评论 0 0
  • 1.web服务器(web server)和应用服务器(appliction server)的区别是什么? web服...
    onlyHalfSoul阅读 598评论 0 0
  • Part 1 @Description:Report of Servlet Basic, Part 1 @Date...
    susu2016阅读 625评论 0 3
  • 1.web服务器(web server)和应用服务器(appliction server)的区别是什么? web服...
    伐无道阅读 933评论 0 0
  • Servlet学习的大纲 servlet概念及相关接口简介 servet 执行过程 servlet映射路径 缺省s...
    奋斗的老王阅读 1,181评论 1 51