JavaWeb 之Servlet 干货详解(一)
目录
一.Servlet简介
Servlet的作用
- Servlet是JavaWEB三大组件之一,而且是最重要的。
- 通常一个功能就需要创建一个Servlet,例如登录是一个功能,那么就要创建一个Servlet,注册也是一个功能,也要创建一个Servlet。
- 当浏览器发送请求给服务器时,服务器会请求的处理工作交给对应的Servlet来完成。
什么是Servlet
- Servlet是JavaWEB提供的一个接口,我们创建的Servlet需要实现该接口。
Servlet 运行在服务端的Java小程序。
用来接收浏览器数据,处理数据,返回处理结果。
创建Servlet步骤
- 创建一个Java文件,创建一个类,这个类要继承BaseServlet
该类中要添加一个请求处理方法:
- 方法名无限定
- 方法不能有参数
- 方法的返回值必须是String
为Servlet在web.xml中配置url
<servlet>元素
- <servlet-name>:通常无限定
- <servlet-class>:指定Servlet完整的类名称(包含包名的)
<servlet-mapping>元素
- <servlet-name>:为要谁指定url
- <url-pattern>:指定url,通常以“/”开头
二.Servlet-常见问题
1、<servlet>和<servlet-mapping>下的<servlet-name>必须相同
2、<serlvet>下的<servlet-class>指向的servlet路径必须正确
3、web.xml中,所有的<servlet-mapping>中 <url-pattern>绝对不能相同
4、忘记继承BaseServlet
5、请求路径上忘记 传递method参数
6、lib文件夹必须放在WEB-INF下
三. Servlet-如何接收表单参数列表
- get方式:
表单:
<form action=”/项目名/servlet路径”>
<input type=”hidden” name=”method” value=”servlet方法名”/>
JavaBean:
成员变量的名称必须和表单name属性相同
成员变量的类型尽量是String
Servlet:
JavaBean 对象 = toBean(JavaBean.class);//数据就在对象中封装
解决中文乱码:(较少)
String 解决 = new String(“乱码”.getBytes(“iso8859-1”),”utf-8”);
Get练习:
form.jsp
<form action="/javaweb_day02_1/d1">
<input type="hidden" name="method" value="run2"/>
<input type="text" name="username"/><br/>
<input type="password" name="pwd"/><br/>
<input type="submit"/>
</form>
User.java
public class User implements Serializable {
private String username;
private String pwd;
//get/set/有参/无参/toString
}
Demo1.java
/*
* 接收从form.jsp传递而来的表单数据
* */
public String run2() throws UnsupportedEncodingException {
//接收表单数据
User user = toBean(User.class);
//get乱码解决:
String username = user.getUsername();
username = new String(username.getBytes("iso8859-1"),"utf-8");
user.setUsername(username);
System.out.println(user);
return null;
}
- post方式:
表单:
<form action=”/项目名/servlet路径”>
<input type=”hidden” name=”method” value=”servlet方法名”/>
JavaBean:
成员变量的名称必须和表单name属性相同
成员变量的类型尽量是String
Servlet:
JavaBean 对象 = toBean(JavaBean.class);//数据就在对象中封装
内部已经解决了乱码:
请求体编码解码都使用utf-8
复选框的接收:
四. request对象
1. 简述&继承树
request对象的类型
- HttpServletRequest是一个接口,实现类由服务器(Tomcat)提供。
- 父接口:ServletRequest
request对象的作用
- request与HTTP请求之间的关系:Tomcat会把所有请求协议的数据封装到request对象中,再把request对象传递给Servlet
封装请求行数据:
- 请求方式:GET、POST
- 请求URL:网址
- 请求协议与版本:HTTP /1.1
封装请求头数据
- 请求头:
- String getHeader(String name):通常参数指定的头名称返回对应的值
- int getIntHeader(String name):会把上面方法返回的字符串转换成int类型
- long getDateHeader(String name):会把上面方法返回的字符串表示的时间转换成毫秒值
- Enumeration<String> getHeaderNames():返回所有头的名称
封装请求参数数据
- 所有的请求参数
- String getParameter(String name):通过参数名获取参数值
- Map<String,String[]> getParameterMap():获取所有参数和和参数值
- String[] getParameterValues(String name):通过参数名获取0-N个参数值。
- Enumeration<String> getParameterNames():获取所有参数名称
request域属性及请求转发
request域属性
- Object getAttribute(String name):通过属性名获取属性值
- void setAttribute(String name, Object value):保存一个属性
- void removeAttribute(String name):通过属性名删除一个属性
- Enumeration<String> getAttributeNames():获取所有属性名称
从request对象中读信息,向response对象中写
现在我们servlet中获取的request对象,都实现了HttpServletRequest接口
2.Request操作-行
方法声明 |
功能描述 |
String getRemoteAddr() |
该方法用于获取请求客户端的IP地址,其格式类似于“192.168.0.3” |
String getContextPath() |
该方法用于获取请求URL中属于WEB应用程序的路径,这个路径以“/”开头,表示相对于整个WEB站点的根目录,路径结尾不含“/”。如果请求URL属于WEB站点的根目录,那么返回结果为空字符串("") |
|
|
方法声明(不建议/过时) |
功能描述 |
String getMethod() |
该方法用于获取HTTP请求消息中的请求方式(如GET、POST等) |
String getRequestURI() |
该方法用于获取请求行中资源名称部分,即位于URL的主机和端口之后、参数部分之前的部分 |
String getQueryString() |
该方法用于获取请求行中的参数部分,也就是资源路径后面问号(?)以后的所有内容 |
String getProtocol() |
该方法用于获取请求行中的协议名和版本,例如,HTTP/1.0或HTTP/1.1 |
String getServletPath() |
该方法用于获取Servlet的名称或Servlet所映射的路径 |
String getRemoteHost() |
该方法用于获取请求客户端的完整主机名,其格式类似于“pc1.itcast.cn”。需要注意的是,如果无法解析出客户机的完整主机名,该方法将会返回客户端的IP地址 |
int getRemotePort() |
该方法用于获取请求客户端网络连接的端口号 |
String getLocalAddr() |
该方法用于获取Web服务器上接收当前请求网络连接的IP地址 |
String getLocalName() |
该方法用于获取Web服务器上接收当前网络连接IP所对应的主机名 |
int getLocalPort() |
该方法用于获取Web服务器上接收当前网络连接的端口号 |
String getServerName() |
该方法用于获取当前请求所指向的主机名,即HTTP请求消息中Host头字段所对应的主机名部分 |
int getServerPort() |
该方法用于获取当前请求所连接的服务器端口号,即如果HTTP请求消息中Host头字段所对应的端口号部分 |
String getScheme() |
该方法用于获取请求的协议名,例如http、https或ftp |
StringBuffer getRequestURL() |
该方法用于获取客户端发出请求时的完整URL,包括协议、服务器名、端口号、资源路径等信息,但不包括后面的查询参数部分。注意,getRequestURL()方法返回的结果是StringBuffer类型,而不是String类型,这样更便于对结果进行修改 |
代码:
public String run1(){
System.out.println("操作请求行");
//读取请求行
HttpServletRequest request = getRequest();
//常见:
//0:0:0:0:0:0:0:1 127.0.0.1 localhost : 本机
System.out.println(request.getRemoteAddr());
//当前项目名 /javaweb_day04_1
System.out.println(request.getContextPath());
//了解:
//请求方式:get/post
System.out.println(request.getMethod());// get
//请求路径
System.out.println(request.getRequestURI());// /javaweb_day04_1/d3
System.out.println(request.getRequestURL());// http://localhost:8080/javaweb_day04_1/d3
//请求参数 get
System.out.println(request.getQueryString());// method=run1&username=zzz&pwd=111
//获取当前servlet路径
System.out.println(request.getServletPath());// /d3
//获取端口号
System.out.println(request.getRemotePort());// 62065
//获取服务器名称
System.out.println(request.getServerName());// localhost
//获取协议名
System.out.println(request.getScheme());// http
return null;
}
3.Request操作-头
方法声明 |
功能描述 |
String getHeader(String name) |
该方法用于获取一个指定头字段的值,如果请求消息中没有包含指定的头字段,getHeader()方法返回null;如果请求消息中包含有多个指定名称的头字段,getHeader()方法返回其中第一个头字段的值 |
public String run2(){
System.out.println("操作请求头");
HttpServletRequest request = getRequest();
System.out.println(request.getHeader("accept"));
System.out.println(request.getHeader("memeda"));//null
return null;
}
4.Request操作-体
仅有post请求,才有请求体
获取参数列表:
JavaBean 对象 = toBean(JavaBean.class); //需要获取全部数据,封装到JavaBean
如果需要针对性地获取某一个参数:
String 参数值 = getParameter(“参数名”);
注意:如果有多个参数,仅返回第一个
String[] 参数值 = getParameterValues(“参数名”);
注意:以上两者,如果该参数不存在,返回null
代码:
public String run3(){
System.out.println("获取参数列表");
//针对性获取某一个参数的值
String username = getRequest().getParameter("username");
System.out.println(username);
//针对性获取某一个参数值,String[]
String[] hobby = getRequest().getParameterValues("hobby");
System.out.println(Arrays.toString(hobby));
return null;
}
未完待续,下篇详解~~~
看完恭喜你,又知道了一点点!!!
你知道的越多,不知道的越多!
~感谢志同道合的你阅读, 你的支持是我学习的最大动力 ! 加油 ,陌生人一起努力,共勉!!
注: 如果本篇有需要改进的地方或错误,欢迎大神们指定一二~~
下一篇: MySQL Tuning Summary
推荐阅读
-
linux命令大全之at命令详解(一次性定时计划任务)
-
Transactional replication(事务复制)详解之如何跳过一个事务
-
解析Android开发优化之:对界面UI的优化详解(一)
-
Android开发笔记之:一分钟学会使用Logcat调试程序的详解
-
mysql视图之确保视图的一致性(with check option)操作详解
-
详解Docker学习笔记之搭建一个JAVA Tomcat运行环境
-
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
-
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
-
06-码蚁JavaWeb之Servlet生命周期与基本配置
-
linux命令大全之at命令详解(一次性定时计划任务)