XMAPP是自己封装的一套 web 开发套件 —— 例如Tomcat等是用自己的,而不是使用系统中其他地方安装好了的。此外将提供的 xampp 工具解压到 D 盘根目录下。(注意 xampp 一定要解压到根目录下才有效。所谓根目录是指 D:\xampp\目录下不能再嵌套 xampp 目录,而是直接在 D:\xampp\目录下能够找到 mysql 目录。切记!!)。

Servlet:Services+Applet的缩写。GET 方法可能返回缓存数据,而POST 方法不会缓存数据,并且常用于连同请求一起发送数据。

Tomcat的配置:

  1. 下载:http://tomcat.apache.org。
  2. 用Eclipse等IDE新建一个Web类型工程,导入Tomcat的servlet-api.jar包(JSP语法支持)。
  3. 将工程部署在Tomcat服务器上:选择Window|Preferences选项,在Preferences对话框中,选择Server|Runtime Environments,选中Add按钮,选择与下载的Tomcat版本相同的,在下一个页面选择其安装目录,确定即可完成服务器的配置。
  4. 运行选择Run on Server,然后在对话框中,选择与刚才相同版本的Tomcat服务器。

Tomcat管理界面(workspace里面那个Server没有管理界面):

  配置登录用户——在Tomcat安装目录的conf下,修改tomcat-users.xml文件,加上一个<user username="" password="" roles=""></user>。

创建Servlet(不使用IDE对话框向导):

  1. 新建一个类,继承javax.servlet.http.HttpServlet接口。
  2. 重写GenericServlet的init方法(有/无参数)、destroy方法,以及HttpServlet的service(HttpServletRequest,HttpServletResponse)方法。——探究Servlet的生命周期。
  3. 配置WebContent\WEB-INF目录下的web.xml文件:创建访问Servlet类的入口地址(servlet-name、servlet-class、url-pattern,其中servlet-class如果写对了,是可以链接过去的)。

生命周期:

请求访问该Servlet(访问刚才的入口地址)——Tomcat的Web Server将请求发送给Servlet容器,然后容器找到Servlet类并实例化(init方法,无参的init是必须的,因为有参的init也会调用无参的),然后就可以提供服务(调用service方法:请求n次,实例化一次,提供服务n次,在service方法中根据不同的请求,调用不同的http请求方法),最后容器销毁Servlet实例(调用destroy方法:把工程最终版本导出到webapps目录下,运行tomcat的启动脚本,进入管理界面,stop或者Undeploy掉Servlet类)。

示例代码:

//servlet.HelloServlet类
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
System.out.println("init without param");
} @Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
System.out.println("init with param");
} @Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("service");
PrintWriter writer = response.getWriter();
writer.println("hello");
writer.close();
} @Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
System.out.println("service");
}
<!-- web.xml -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

加上初始化参数:

<servlet>
<servlet-name>InitServlet</servlet-name>
<servlet-class>Servlet.testServlet</servlet-class>
<init-param>
<param-name>user</param-name>
<param-value>shutao</param-value>
</init-param>
<init-param>
<param-name>password</param-name>
<param-value>114809</param-value>
</init-param>
</servlet>

使用Servlet的filter:

Filter与Servlet的相似,但Filter的生命周期必然在对应的Servlet之前(不过也是在第一次访问对应的url-pattern时,才创建Filter的实例。先执行了过滤器链的所有doFilter方法之后,最后再访问对应的Servlet。过滤器可以截获到用户提交的request,最后由Servlet返回response)——由于过滤器的功能,所以它可以被应用于权限校验、日志记录、图像处理、数据压缩等。

创建一个Filter(这里只列举重要的方法):

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// TODO Auto-generated method stub
// place your code here
System.out.println("doFilter start");
chain.doFilter(request, response);
System.out.println("doFilter end");
}
public void init(FilterConfig fConfig) throws ServletException {
// TODO Auto-generated method stub
System.out.println("init");
String initParam = fConfig.getInitParameter("param");
System.out.println("initParam = " + initParam);
}

配置过滤器:

<filter>
<filter-name>FilterOne</filter-name>
<filter-class>filter.FilterOne</filter-class>
<init-param>
<param-name>param</param-name>
<param-value>qunyh</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>FilterOne</filter-name>
<!-- 对任意的Servlet过滤 -->
<url-pattern>/*</url-pattern>
</filter-mapping>

过滤器链:

即依次执行多个过滤器,执行顺序是在web.xml中的编写顺序,但销毁和结束的顺序却是相反。

在JSP页面中,引入包:

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" import="java.util.*"%>

JSP元素:

脚本元素、指令元素、动作元素。

直接总结指令(形如<%@***>)、动作(形如<jsp:***>):

1、编译指令Page:

JSP页面错误页的设置和使用:

在处理错误的页面的page指令中,设置isErrorPage="true";在出错页面,设置errorPage="处理错误的页面"。

2、include指令:

//index页面
<body>
<%@ include file="header.jsp" %>
</body> //header.jsp页面
<div>
This is header.
</div>

与ASP相对照:

<!--Header-->
<%template src="_header.html"%>
<!--/Header-->

3、taglib指令。

动作指令

forward指令,并且在页面跳转时,进行参数传递:

//index页面
<jsp:forward page="login.jsp">
<jsp:param value="shutao" name="username"/>
<jsp:param value="114809" name="password"/>
</jsp:forward> //login页面
<body>
<%
//使用JSP内置对象request获得传递的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
out.println(username + ": " + password);
%>

useBean指令:

useBean指令可指定JavaBean的使用范围,例如:

<jsp:useBean id="user" scope="page|request|session|application" class="bean.UserBean"></jsp:useBean>——这其中的scope只能选其一。

创建Bean类:

  1. 一定要添加Serializable接口,不然会抛出异常。
  2. 所有属性都要通过getter、setter方法来获取、更改。
  3. 类中要有一个空的构造函数(仅指参数为空,方法体可以不为空)。

通过Bean实现,多个页面之间传值:

例如创建一个UserBean类,其中有username、password属性;然后创建一个register和do_register页面,将register提交的属性,保存在do_register页面的Bean中(这个页面的实例,所以只能在创建页面使用)。

<!-- register页面 -->
<body>
<form action="do_register.jsp" method="post">
用户名:<input type="text" name="username"><br>
密码:<input type="password" name="password">
<input type="submit" value="提交">
</form>
</body>
//do_register页面
<body>
<jsp:useBean id="user" class="bean.UserBean"></jsp:useBean> <!-- useBean指令注册JavaBean,不必像下面这样,这里的user已经是UserBean的实例了,可直接像使用普通对象一样使用 --> <jsp:setProperty property="username" name="user"/> <!-- 设置Bean的属性值 -->
<jsp:setProperty property="password" name="user"/> <jsp:getProperty property="username" name="user"/> <!-- 获取Bean的属性值 -->
<jsp:getProperty property="password" name="user"/>
</body>

Servlet实现的接口:

配置-ServletConfig:

继承的主要的方法:

//配置信息:Servlet名字、初始化参数、上下文
getInitParameter(String name);
getInitParameterNames();
getServletContext();

请求与响应-ServletRequest、ServletResponse:

方法:

//Request
getCookies();
getSession();
getSession(boolean create);
getParameter(String name); String[] getParameterValues(String name); //获取input(checkbox)或select的值
//获取input或者select的值
<!--input页面,action=show.jsp-->
<input type="checkbox" name="channel" value="报刊">报刊
<input type="checkbox" name="channel" value="网络">网络<br/>
<input type="checkbox" name="channel" value="朋友推荐">朋友推荐
<input type="checkbox" name="channel" value="电视">电视
<!--show.jsp-->
<%
if (channels != null) {
for (String channel: channels) {
out.print(channel+"&nbsp;");
}
}
%> //Response
addCookies(Cookies cookie);
encodeURL(String url);
sendRedirect(String location);
setContentType(String type);
setCharacterEncoding(String charset);

Servlet协作(页面之间的跳转,如果有请求,也会一起转发):

方法:

forward(ServletRequest req, ServletResponse res);    //把请求转发给RequestDispatcher对象的页面;实际上是新开一个线程,去加载新的页面,但是原来页面中的程序也会继续执行
include(ServletRequest req, ServletResponse res); //把RequestDispatcher的页面包含到响应之中

重定向sendRedirect和转发请求RequestDispatcher的对比:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
String username = request.getParameter("username");
String password = request.getParameter("password");
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
if(checkUser(user))
{
//RequestDispatcher实现对请求的转发:因此无论怎样跳转,表单数据都可以发送到指定页面;此外转发只能用于同一程序的页面(只加载的是新url的内容,地址不变)
request.setAttribute("user", user);
RequestDispatcher dispatcher = request.getRequestDispatcher("LoginSuccess.jsp");
dispatcher.forward(request, response);
}
else
{
//纯粹的跳转:一共有两次跳转,这是第二次,并没有涉及到表单数据,所以这个页面是无法获取之前提交的表单数据;可以跳转到任何URL(重定向:相当于自动重新访问一个新的url)
response.sendRedirect("LoginFailed.jsp");
}
}

会话跟踪-HttpSession:

好像是因为tomcat什么的,没有会话层(ISO7层),因此在客户端创建Session,维持与Http会话之间的关联,即维持单个客户端的状态(由Servlet创建并实现)。

方法:

getCreationTime();
getId();
getLastAccessedTime();
getMaxInactiveInterval();
getValue(String name);
getValueNames();
invalidate();
isNew();
putValue(String name, Object value);
removeValue(String name);  //如果是用于退出登录,那么应将session中存储的所有对象统统删除,以免退出登录之后,用户在其他页面依然能够访问到这些对象
setMaxInactiveInterval(int interval);

Servlet上下文:

ServletContext对象代表多个Servlet要共享的资源。

方法:

getAttribute(String name);
getAttribute(String uripath);
removeAttribute(String name);
setAttribute(String name, Object obj);

JSP内置对象

1、request对象:javax.servlet.http.HttpServletRequest的实例(new不出来)。这个对象封装了客户端提交的请求信息:

  1. 状态行。
  2. HTTP头。
  3. 信息体。
<%
out.println("/工程名:" + request.getContextPath() + "<br />");
out.println("协议类型:" + request.getScheme() + "<br />");
request.getServletContext().getRealPath("项目下的某目录名");//获得虚拟目录的真实路径
String path = request.getContextPath();
String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
out.println("浏览器访问工程的路径:" + basePath); //显示效果(即服务器 + 工程名) ———— http://localhost:8080/Spring/
%>

2、response:是javax.servlet.http.HttpServletResponse实例(不是new出来的)。

request是客户端向服务器发送请求,response是服务器对客户端的请求,作出回应。

类似于HTTP请求,HTTP响应也有3个基本部分:

  1. 状态行:包含了,协议、状态码(表示请求是否成功)。
  2. 头Header:设置关于服务器和返回的文档信息——如服务器名称、文档类型。
  3. 信息体。

例子:

<body>
<%
response.setHeader("Refresh", "1");
response.setIntHeader("Refresh", 1);
out.println(new java.util.Date());
%>

3、application对象:

由于同一台电脑的同一浏览器(即同一进程)访问服务器的session相同,所以此时要记录这台电脑上登陆的不同用户,就需要一个跨session的容器:application(相当于所谓的全局变量)。因此不同用户可以通过application共享数据。常用的方法有:

void setAttribute(String key, Object value);    //以键值对保存数据
Object getAttribute(String key); //通常需要强转

JavaWeb 基础学习的更多相关文章

  1. JavaWeb基础学习体系与学习思路

    对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一 ...

  2. JavaWeb基础: 学习大纲

    JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb ...

  3. JavaWeb的学习路线

    JavaWeb的学习路线 一.BS结构 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将 ...

  4. 个人技术博客(α)------javaweb的学习路程

    该博文大致内容是学习的一个过程,心得,并不是以技术博客为主,在此说明. 关于javaweb的学习开始的时间大概是从大二下(2017年6.7月份)的暑假开始的,在学长的介绍下加入了实验室进行学习,由于是 ...

  5. JavaWeb基础知识总结

    JavaWeb基础知识总结.   1.web服务器与HTTP协议 Web服务器 l WEB,在英语中web即表示网页的意思,它用于表示Internet主机上供外界访问的资源. l Internet上供 ...

  6. 零基础学习hadoop到上手工作线路指导(编程篇)

    问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...

  7. 超详细的Java面试题总结(四 )之JavaWeb基础知识总结

    系列文章请查看: 超详细的Java面试题总结(一)之Java基础知识篇 超详细的Java面试题总结(二)之Java基础知识篇 超详细的Java面试题总结(三)之Java集合篇常见问题 超详细的Java ...

  8. 七天从零基础学习android(1)--配置环境

    在写这篇文的时候android开发经验还是0,是一个萌新,这是一篇记录一个萌新从零android编程基础到能编写一个记账本的开发过程(至少我是这样美好的希望着的) 首先因为是没有开发基础的,直接上百度 ...

  9. salesforce 零基础学习(五十二)Trigger使用篇(二)

    第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...

随机推荐

  1. MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!

    最近做数据备份的时候发现了有个很严重的问题,那就是数据丢失(最后证明没丢,是别的问题造成的). 问题如下: 我通过两种方式在两个mongoDB集群中,对一组collection进行备份,最后2个备份数 ...

  2. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  3. centos 7上nginx+uwsgi 性能调优

    上一章将nginx +uwsgi搭建起来,将keystone挂载后面.但是发现一个问题,如果http请求达到一定量后,nginx直接返回502.这让需要部署大规模openstack集群的我很是头疼,比 ...

  4. deepin安装Python3.6和pip

    1.安装python3.6 sudo apt-get install python3.6 2.修改软连接 sudo ln -s /usr/local/bin/python3.6 /usr/bin/py ...

  5. 建议使用nginx配合uwsgi,

    试试gunicorn+supervisor+nginx. gunicorn是Python实现的的Web server,配置也比较简单. supervisor也是Python实现的,它用于进程管理. 这 ...

  6. PHP多进程非阻塞模式下结合原生Mysql与单进程效率测试对比

    公司在做游戏服务器合并的时候,对大批量数据表做了合并操作,难免会出现数据格式不一致问题.根据玩家反映BUG排查,是因为某个模块下日志表出现了数据格式问题导致. 目前想到的是有两种方案解决,第一种就是把 ...

  7. sed/awk advance

    $ echo test.file [Group1]cacheways = 19 [Group2]cacheways = 19 $ ls test.sh FILE=test.file2 # Set Gr ...

  8. 快速阅读《QT5.9 c++开发指南》1

    简介:<QT5.9 c++开发指南>的作者是和i三位主要从事地球物理探测仪器设计.数据处理方法研究和软件开发等工作的博士们,这本书以QT Widget为主要内容,比较全面地教授了QT开发桌 ...

  9. 20145320周岐浩 web安全基础实践

    20145320周岐浩 web安全基础实践 一.实验后回答问题 (1)SQL注入攻击原理,如何防御 一.SQL注入攻击原理 SQL注入攻击值得是通过构建特殊的输入作为参数传入web应用程序,而这些输入 ...

  10. java开发注意点之String使用equals和==的区别

    "=="操作符的作用 1.用于基本数据类型的比较 2.判断引用是否指向堆内存的同一块地址. equals所在位置: 在Object类当中,而Object是所有类的父类,包含在jdk ...