WEB入门浅谈10

Servlet

Servlet 是一组API ,Tomcat提供的API,功能是开发动态页面
API里核心的类:HttpServlet HttpServletRequest HttpServletResponse


Servlet里内置了Session机制
Session一般是搭配Cookie来使用的
Cookie保存的是客户端的信息,如:用户身份标识
Session是服务器端保存的信息,按照键值对的形式对数据进行组织,通过Cookie中的用户身份标识(SessionId)确定一个Session对象,在这个对象中过就可以管理其它信息了

Servlet生命周期

Servlet 对象的生命周期 就表示什么阶段做什么事情
初始化阶段: 调用一次init
每次收到请求: 调用service方法(HttpServlet 里面的service方法又会调用doxxx方法)
服务器退出之前: 调用一次destroy方法(服务器正常退出,就会执行destroy方法,如果是异常退出,就不会执行)

使用post方法

由于post请求数据存储在body中,而不是query string中, 而body中的数据是由content-type来指定的,content-type中能指定的选项有很多,其中有一种x-www-form-urlencoded 选项,其数据格式形如a=10&b=20,其获取方式与之前的一样,如:req.getParameter("a")

@WebServlet("/lit")
public class AddServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String a = req.getParameter("a");
        String b = req.getParameter("b");
        int ret = Integer.parseInt(a) + Integer.parseInt(b);
        resp.setContentType("text/html");
        resp.getWriter().write("<h3> result = " + ret + "</h3>");
    }
}

代码写完之后,进行打包,部署。
但是发现访问指定页面时,发送的请求还是get方法。现在就需要在浏览器这边能够构造出一个post请求给服务器发送出去。
浏览器构造post请求的方法有两个:
使用form表单
使用ajax对象(JavaScript里面一种特殊的对象)

此时使用form表单来解决
form表单其实就是html中一个form标签
此时就需要在webapp目录下创建一个html文件
在body部分添加一个form标签,属性action填写要调用的类的路径(就是哪个类的WebServlet里填写的路径,method 里写要使用什么方法(get请求就写get,post请求就写post)),由于计算的是a b 的和,所以需要输入 a b 的值,则添加两个input标签获取 a b 的值,最后再给一个跳转的input标签即可

<body>
    <form action="lit" method="post">
        a = <input type="text" name="a">
        b = <input type="text" name="b">
        <input type="submit" value="提交">
    </form>
</body>

重新打包,部署,访问地址为http://localhost:8080/项目名/html文件全名称

HttpServletRequest

对于一个HTTP请求来说:
首行:方法,URL,版本号。这三个信息的返回值都是String类型的,获取方法为:getMethod() getRequestURI() getProtocol()(此处的URI是更为广义的URL)

head部分:若干键值对。获取属性名,返回值为枚举(Enumeration)类型getHeaderNames()获取属性值,返回值为String类型gerHeader(String name)

body部分:如果body的Content-Type 类型是 x-www-form-urlencoded就可以通过getPatameter获取到里面的内容,如果是其它类型就可以通过getInputStream获取到一个流对象,进一步就可以通过这个对象获取到body里面的内容了

针对一些常用信息:
如:Content-Type、ContentLength、Cookie、ContentPath、query string,这些信息都包含在URL或者head中,可以通过getSession()来获取,返回值的类型是HttpSession

针对HttpServletRequest,更常用的是需要获取到 请求中带有的参数 ,来自于query,或者是body。

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod();
        String url = req.getRequestURI();
        String protocol = req.getProtocol();
        String query = req.getQueryString();
        Enumeration headNames = req.getHeaderNames();
        String referer = req.getHeader("Referer");
        String host = req.getHeader("Host");
        String contentType = req.getContentType();
        int contentLength = req.getContentLength();
        String contentTyppe2 = req.getHeader("Content-Type");
        String contentLength2 = req.getHeader("Content-Length");
    }
HttpServletResponse

HttpServletRequest 里的方法都是get系列的
HttpServletResponse 里的方法都是set系列的

对于一个Http响应:
首行:版本号,状态码,状态码描述。设置状态码:setStatus(int sc),如果不设置,默认就是200

head部分:可以通过setHeader(String key,String value) addHeader(String key,String value)如果key已存在,那么setHeader里面的value就会覆盖原本的value,而add就会新建一个同名key,两个同key不同value同时存在
一些特殊的属性会有单独的方法。

body部分:resp.getWriter()会得到一个PrintWriter对象,write方法,可以让我们写入一个字符串

补充

如果创建maven时不成功,下载依赖失败,那么可以尝试换一下maven默认的源,换成阿里云的源
如果没有setting.xml文件,那么就创建一个,把找到的文件内容,拷贝进去,重启idea,重新创建项目,如果还是不行,那么就需要导入一个可以正常使用的本地仓库,导入到项目里即可。


让路径和某个HttpServlet类关联起来有两种方式:
用 @WebServlet("/lit") 推荐
通过web.xml填写一些配置,比较麻烦,也很容易出错。


如果只重写了doPost方法,但是用GET请求,就会出现405,提示方法不允许
如果是get方法,url中没有需要的的query string,就会出现500错误


如果.m2目录下的settings.xml配置有误,那么在pom.xml里配置时就会出现一些问题,导致导包不成功,可以尝试删除。


每次部署都需要把打包的结果复制到webapps目录下,有些麻烦,就可以使用idea里的一个插件 smart Tomcat ,就可以在idea上直接打包+部署+启动Tomcat
Tomcat 在运行的时候,默认加载的是webapps目录下的代码
但是smart Tomcat 这个插件并没有把war包拷贝到webapps目录下,而是启动tomcat,再让tomcat来读取当前项目webapp目录中的内容


在拼接字符串时用+比较麻烦,如:

	public static void main(String[] args) {
        String result = "lit";
        String string = "result = " + result + ".";
    }

那么就可以使用格式化字符串的方式来进行拼接,如:

	public static void main(String[] args) {
		int a = 10;
        String result = "lit";
        String string = String.format("result = %s . ",result);
        String str = String.format("a = %d . ",a);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值