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);
}