servlet学习笔记

01.网站(web应用)结构

    网站(web应用)目录结构
webRoot 根目录
(1)普通文件(html,css,js,images)
(2)WEB-INF(目录,固定大写)
(a)classes(目录:存放class文件)
(b)lib    (目录:存放jar包)
(c)web.mxl(文件:用于配置WEB-INF)
注意:
(1)WEB-INF外面的文件是可以直接通过浏览器访问
(2)但是WEB-INF里面的文件不可以通过浏览器直接访问

(3)如果需要访问WEB-INF里面的文件,可通过配置web.mxl文件以供外界访问


02.网站部署

    如何发布网站
(1)直接把文件放到webapps文件中
(2)ROOT是默认网站,访问不需要名称
(3)设置首页

  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0"
  metadata-complete="true">



首页.html



注意:
网站和tomcat软件放在同一个盘会占用大量资源--(把软件和网站分离)


(4)配置虚拟网站(通过修改server.xml)
conf-->server.xml
docBase:网站绝对路径
path:访问网站的名称

  注意:
path=""时,表示当前网站是默认网站,优先级大于ROOT网站

弊端:需要修改server.xml文件

(5)配置虚拟网站(通过添加xml文件的方式配置虚拟网站)--(推荐使用)

在conf\Catalina\localhost文件下添加一个xml文件


注意:

添加的xml文件名称就是访问网站时的名称


03.添加站点

    (1).站点
conf-->server.xml-->
name:表示站点名称--(访问站点就是使用站点的名称无访问的)
appBase:表示站点目录

            unpackWARs="true" autoDeploy="true">

    (2).站点和网站的关系
    一个站点可以包含多个网站
    一个网站就在一个站点中


    (3).添加站点
    conf-->server.xml-->新建一个标签
    -->
                         unpackWARs="true" autoDeploy="true">

    访问站点中的网页:

    需要在hosts文件中添加一个站点和ip地址的映射


04.动态网站的开发

    1.
    (1)静态网页:用户多次访问这个网页时,网页的源码是不会改变的(html、css、js)
    (2)动态网页:用户多次访问这个网页时,网页的源码是有可能改变的
    (3)静态网站:只包含静态网页
    (4)动态网站:既有静态网页,也有动态网页


    2.使用servlet技术开发动态网页
    servlet特点:
(1)servlet就是一个普通java类,继承HttpServlet
(2)Servlet交给web服务器软件(tomcat)服务器运行




    3.手动开发一个Servlet
(1)编写一个普通的java类,继承HttpServlet,覆盖doGet方法
    (注意:HttpServlet需要servlet-api.jar,可在tomcat的lib目录下找到)
     Demo:
public class HelloServlet extends HttpServlet {
 
//覆盖doGet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//想浏览器输出当前系统时间
resp.getWriter().write("当前时间为:"+new Date());
}
}
(2)把servlet交给tomcat服务器运行
(a)把servlet对应的class文件拷贝到tomcat的某个网站下的WEB-INF的classes目录下
    (如果有包名,需要把bin下的包名拷到classes目录下)
(b)在WEB-INF中添加一个web.xml文件,并配置文件
     Demo:








 
  
 
 
  HelloServlet
 
  gao.a_05servlet_firstServlet.HelloServlet
 

 
 
 
  HelloServlet
 
  /hello
 




(3)通过url访问这个servlet
Demo:
http://localhost:8080/web/hello

    4.用工具(MyEclipse)开发servlet


05.请求信息详解

    1.请求(提交)方式-(请求行)
http协议中的请求方式:get、post、head、put、connect......
常用:get、post




(1)get方式:
提交的参数会显示到地址栏
原理:get方式提交的参数会跟在请求内容的URI后面,以?开始,每个参数使用=号分开,
      第二个参数之后使用&符号链接
     (不适合提交敏感的数据,提交的数据不超过1kb)
Demo:
GET/mydemo/testMethod.html?name=marry&password=123456HTTP/1.1

(2)post方式:
提交的参数不会显示到地址栏
原理:post提交的参数跟在请求的实体内容中
     (适合提交敏感数据,提交的数据大小没有限制)


    2.请求头
以键值对方式存在

Accept         浏览器接受的数据类型
Accept-Charset 浏览器接受的数据编码格式
Accept-Encoding 浏览器接受的数据压缩格式
Accept-Language 浏览器接受的语言
Host         请求发出的主机和端口
if-Modified-Since         浏览器缓存的最后修改时间
Referer         当前请求来自哪里(防止非法链接)
User-Agent         浏览器的类型
cookie         浏览器保存的cookie数据
Connection         浏览器和服务器的链接状态(colse关闭 keep-alive保持链接)

Date         请求发出的时间


06.请求HttpServletRequest对象的使用

    HttpServletRequest对象获取请求数据
(1)请求行:
request.getMethod() 获取请求方式
request.getRequestURL 获取请求资源
request.getRequestURI 获取请求资源
request.getProtocol 获取http协议版本

(2)请求头
request.getHeader("name")
request.getHeaderNames()

(3)实体内容

request.getInputStream()


07.获取浏览器类型与防止非法链接

    1.判断浏览器类型(user-agent)
火狐:Firefox
谷歌:Chrome
IE  :Trident

Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Firefox/52.0
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36
Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko


Demo:
String userAgent = request.getHeader("user-agent");
//System.out.println(userAgent);
if(userAgent.contains("Firefox")){
response.getWriter().write("你正在使用的是火狐浏览器");
}else if(userAgent.contains("Chrome")){
response.getWriter().write("你正在使用的是谷歌浏览器");
}else if(userAgent.contains("Trident")){
response.getWriter().write("你正在使用的是IE浏览器");
}else{
response.getWriter().write("无法识别浏览器的类型");
}

    2.referer头-防止非法链接
refer:表示当前请求来自于哪里-判断哪些是非法的请求
非法请求:
(1)直接访问(referer=null)
(2)当前请求不是来自于某一页面(!=referer.contains(某某.html))
Demo:
if(referer=null || !referer.contains("某某.html")){
response.getWriter().write("当前请求是非法请求!")

}


08.获取请求参数数据

    1.获取参数数据
(1)获取get提交的参数(URI后面的参数数据)
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String params = request.getQueryString();
System.out.println(params);
}

(2)获取post提交的参数(在实体内容中)
public void doPost(HttpServletRequest request, HttpServletResponse resp) throws ServletException, IOException {
ServletInputStream in = request.getInputStream();
byte[] buf = new byte[1024];
int len = 0;
while((len=in.read(buf)) != -1){
String str = new String(buf,0,len);
System.out.print(str);
}
}

    2.处理获取到的参数数据
(1)根据参数名称获取参数值(参数名称就是表单的name属性值)
request.getParameter("")

(2)获取所有参数名称列表
Enumeration enums = request.getParameterNames();
while(enums.hasMoreElements()){
String papamName = enums.nextElement();
String paramValue = request.getParameter(ParamName);
}

(3)获取所有参数对象列表(key:参数名称,value:参数值)
/*
* 获取参数对象列表(以Map集合形式存在)
*/
Map map = req.getParameterMap();
/*
* Map集合如何遍历
* (1)entrySet()
* (2)keySet()
* (3)values()
*/
Set>  entrySet = map.entrySet();
for(Entry entry:entrySet){
//获取键对象
String key = entry.getKey();
//获取值对象(数组的第一个元素就是值对象)
String[] value = entry.getValue();
System.out.println(key+"="+value);

}

/*
Set keySet = map.keySet();
for(String key:keySet){
//通过键对象获取值对象
String[] value = map.get(key);
System.out.println(key+"="+value);
}
*/


/*
//值对象的Collection集合(只能获取值对象)
Collection values = map.values();
for(String[] value : values){
System.out.println(value[0]);
}
*/

(4)根据参数名称获取多个参数值
String[] hobits = request.getParameterValues("hobit");
for(String h : hobits){
System.out.println(h+",");

}


09.接收的参数乱码问题

    设置参数解码时查询的码表(参数乱码问题)
(1)doPost方法(乱码问题)
request.setCharacterEncoding("utf-8");
注意:只对post提交的方法有效(只能对实体内容有效)

(2)doGet方法(乱码问题)
//
if("get".equals(request.getMethod())){
value = new String(value.getBytes("iso-8859-1"),"utf-8");
} 编码 解码

注意:只对doGet方法有效,用if语句判断

你可能感兴趣的:(servlet)