03-实现web项目
1、不使用IDE实现一个webapp
第一步:
在某个文件夹中新建一个名为FirstApp的文件夹,该文件就是一个项目,名字叫FirstApp
第二步
打开FirstApp,在里面新建一个名为login的html文件login.html,并在里面编写简单的静态页面代码
<html>
<head>
<title>login page</title>
</head>
<body>
<form action="">
username<input type="text" name="username"/><br>
password<input type="password" name="password"/><br>
<input type="submit" value="login">
</form>
</body>
</html>
第三步
开发完程序后部署到服务器上,这里是Tomcat服务器,直接将FirstApp文件复制粘贴到Tomcat所在文件夹的webapps文件夹中,这就算部署完成了。
第四步
启动Tomcat服务器,在浏览器输入http://localhost:8080/FirstApp/login.html,回车
第五步
我们在FirstApp文件中新建一个html的文件夹,打开后在里面新建一个welcom.html文件
<html>
<head>
<title>welcome page</title>
</head>
<body>
<h1 align="center"><font color="red">welcome page</font> </h1>
</body>
</html>
第六步
需要重新部署该FirstApp项目,先关闭Tomcat服务器,因为Tomcat中关闭的命令shutdown和Windows关闭系统命令冲突,我们将Tomcat的bin文件目录中的shutdown.bat改为stop.bat。此时在dos命令窗口键入stop,回车,关闭服务器。然后删除原先部署的FirstApp,之后的步骤与上一致。启动服务器,浏览器,输入http://localhost:8080/FirstApp/html/welcome.html,可以看到返回一个欢迎页
第七步
我们想在获取的welcome.html页面中添加一个点击按钮名为login page,点击它跳转到login.html资源页面。可以在welcome.html的代码中添加超链接的方式,如下
<html>
<head>
<title>welcome page</title>
</head>
<body>
<h1 align="center"><font color="red">welcome page</font> </h1>
<hr>
<!--超链接的方式-->
<a href = "http://localhost:8080/FirstApp/login.html">login page</a>
<!--为了更好的通用,URL路径中的IP地址、端口号可以省略,但前面的/不能省-->
<!--以下网络资源路径还是一个绝对路径,目前必须以/开始,不加/就是一个相对路径,就会跳转到当前webapp项目的/FirstApp/login.html这个资源,导致404。这和Linux中学的绝对路径和相对路径是一样的-->
<a href = "/FirstApp/login.html">login page</a>
</body>
</html>
第八步
关闭服务器,覆盖webapps中的FirstApp,启动服务器,浏览器输入请求路径,如下:
2、实现带有servlet的webapp
第一步
创建一个名为FirstServletWebApp的项目文件夹,该文件夹里有多个文件夹,有存放css资源的css文件夹,有存放html资源文件的html文件夹,也有存放JavaScript文件的js文件夹等等,但为了遵循Servlet规范,必须创建一个名为WEB-INF的文件夹,不能改变大小写,不然服务器不能辨识。
WEB-INF文件夹中要建一个classes文件夹,存放该项目的.class字节码文件;建一个lib文件夹,libraries,存放的是项目所需的jar包,就像Tomcat中的lib一样,Tomcat中的是全局的jar包,本项目的是局部的jar包,虽然我们将数据库的驱动jar包放进了系统的calsspath变量中,但当我们这个项目需要连接数据库,服务器是不会到系统中找数据库连接的jar包的,而是到你这个项目的lib中寻找;建一个web.xml文件,存放的是请求路径和资源的关联信息。
第二步
建一个HelloWorld.java文件,该类实现Servlet接口,得实现该接口的所有方法,具体有什么方法,查阅javaEE版本的帮助文档。一共有五个方法
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
public class HelloWorld implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
public void service(ServletRequest request,ServletResponse response) throws IOException,ServletException{
//将信息打印到控制台,而不是输出到浏览器
System.out.println("Hello World!");
}
public void destroy(){
}
//本次的项目程序不多,这里的方法用到的不多,直接返回null
public String getServletInfo(){
return null;
}
//本次的项目程序不多,这里的方法用到的不多,直接返回null
public ServletConfig getServletConfig(){
return null;
}
}
写好保存。现在想要编译,在dos命令窗口javac HelloWorld.java是编译不成功的,因为找不到代码中导入的javax.servlet包下的接口和类,之前我们在Tomcat的lib类库文件夹中发现有jsp和servlet规范的jar包,这是SUN公司写的,Tomcat服务器想要调用我们写的实现Servlet规范的Java Web程序,就得需要面向这两个规范调用,所需要把这两个SUN公司写的规范jar包放到Tomcat的类库lib中。这里我们也需要servlet jar包,直接将Tomcat中lib中的servlet-api.jar中的路径添加到环境变量classpath中。这样只是为了我们编译用的,运行是服务器中找它自己lib类库中的规范包
在编译过程中,由于java文件写完后是已UTF-8的字符编码方式保存,dos命令窗口是GBK简体中文,编译报错,所以将.java文件用记事本打开,然后另存为时选择简体中文字符编码方式ANSI保存,就可以正常编译了
第三步
编译完成后将生成的HelloWorld.class文件放进FirstServletWebApp/WEB-INF/classes中,
第四步
编写web.xml配置文件。怎么样编写,可以参考Tomcat中conf文件夹中的web.xml文件,将其打开,将头部复制过来,注释不用复制。要注意标签的头和尾<web-app ...后面这里得与前面对应
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
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">
<!--这是一个合法的web.xml文件-->
<!--一个webapp只有一个web.xml文件-->
<!--web.xml文件主要配置请求路径和实现Servlet的类名之间的绑定关系-->
<!--web.xml文件在Tomcat服务器启动阶段被解析-->
<!--web.xml文件解析失败,就会导致服务器启动失败-->
<!--web.xml文件的标签不能随便编写,Tomcat服务器早就知道该文件中需要编写的标签,该标签也是SUN制定的规范-->
<!--直接记住下面的个标签写法和含义-->
<servlet>
<!--下面这个servlet-name标签位置的名字随便起,但要与下面同一个标签名一致-->
<servlet-name>thisIsServletName</servlet-name>
<!--下面这个servlet-class标签位置写的是项目中的类名-->
<servlet-class>HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<!--下面这个servlet-name标签位置的名字随便起,但要与上面同一个标签名一致-->
<servlet-name>thisIsServletName</servlet-name>
<!--下面这个url-pattern标签位置写的是请求路径,随意编写,但要以/开头,不用添加项目的名称-->
<!--该请求路径是虚拟的路径,只是代表一个资源的名称,就是上面类的代号-->
<url-pattern>/zzz/dada/sss/aaa</url-pattern>
<!--url-pattern标签还可以编写多个,但都得以/开头且不需要添加项目名-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
第五步
写完后保存,开始部署项目,然后测试,输入网址http://localhost:8080/FirstServletWebApp/zzz/dada/sss/aaa
我们可以看到每一次刷新该网址Tomcat服务器的黑窗口都输出"Hello World!"
因为我们在service方法中写的是输出到控制台,所以浏览器没有输出,下个项目输出到浏览器。
第六步
我们在该项目中的html目录中新建一个welcome.html文件,在里面编写超链接代码,里面跳转的连接请求路径不像上面的url-pattern标签不需要写项目名,这个超链接是需要加项目名的,虽然这个html是在同一个项目中,但是其他项目中的html文件打开后点击里面的连接如何跳转到其他项目的资源呢,这就导致超链接里面的请求路径要加上项目的名字
<html>
<head>
welcome page
</head>
<body>
<a href="/FirstServletWebApp/hello">HelloWorldServlet</a>
</body>
</html>
保存重新部署,重启服务器,输入请问求路径,结果如下
点击HelloWorldServlet,跳转到另一个资源,Tomcat黑窗口输出hello world!
3、将响应结果进行输出的webapp
跟前面一样,建一个项目文件夹ServletPrintToClient,打开在其中建WEB-INF,再打开建classes、lib两个文件目录加一个web.xml文件
任意新建PrintToClient.java
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.ServletException;
import java.io.IOException;
import java.IO.PrintWriter;//标准字符输出流
public class PrintToClientt implements Servlet{
public void init(ServletConfig config) throws ServletException{
}
//五个方法中重点是该方法
public void service(ServletRequest request,ServletResponse response) throws IOException,ServletException{
//有时候响应到浏览器的内容中文会出现乱码,那么用响应对象设置编码方式
/*
ServletResponse接口有这样一个方法:
void setContentType(String type)
Sets the content type of the response being sent to the client, if the response has not been committed yet.
该方法设置内容类型和字符编码方式,不能写错,且要在获取标准流之前设置
*/
response.setContentType("text/html;charset=UTF-8");
//想将信息输出到浏览器,就需要使用标准输出流将程序的输出位置更改
/*
ServletResponse接口有这样一个方法:
PrintWriter getWriter()
Returns a PrintWriter object that can send character text to the client.
该方法返回一个将信息输出到客户端的PrintWriter类的标准字符输出流对象
*/
PrintWriter out = response.getWriter();
//将HTML字符串输出到浏览器上,Browser解释执行HTML语言
//这里响应HTML代码到浏览器
//下面不需要用println()方法,没有必要,用的话只是将HTML字符串换行输出到浏览器,浏览器看源码
//的时候HTML源代码是换行的,这样还会占内存,影响效率。
//但是你想要将里面夹带的文字什么的信息换行,有其他方法
out.print("<html>");
out.print("<head>");
out.print("<title>welcome servlet</title>");
//具体信息,h1标记
out.print("<h1 align=\"center\">welcome study servlet</h1>");//该标题下一信息是自动换行的
//该输出信息与标题不在同一行
out.print("hello");
out.print("world");
//换行添加的标签<br>
out.print("<br>");
out.print("大家好!");
out.print("</head>");
out.print("</html>");
}
public void destroy(){
}
//本次的项目程序不复杂,这里的方法用到的不多,直接返回null
public String getServletInfo(){
return null;
}
//本次的项目程序不复杂,这里的方法用到的不多,直接返回null
public ServletConfig getServletConfig(){
return null;
}
}
写好编译,将.class文件放进classes目录中
编写web.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
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">
<!--这是一个合法的web.xml文件-->
<!--一个webapp只有一个web.xml文件-->
<!--web.xml文件主要配置请求路径和实现Servlet的类名之间的绑定关系-->
<!--web.xml文件在Tomcat服务器启动阶段被解析-->
<!--web.xml文件解析失败,就会导致服务器启动失败-->
<!--web.xml文件的标签不能随便编写,Tomcat服务器早就知道该文件中需要编写的标签,该标签也是SUN制定的规范-->
<!--直接记住下面的个标签写法和含义-->
<servlet>
<!--下面这个servlet-name标签位置的名字随便起,但要与下面同一个标签名一致-->
<servlet-name>helloServlet</servlet-name>
<!--下面这个servlet-class标签位置写的是项目中的类名-->
<servlet-class>PrintToClient</servlet-class>
</servlet>
<servlet-mapping>
<!--下面这个servlet-name标签位置的名字随便起,但要与上面同一个标签名一致-->
<servlet-name>helloServlet</servlet-name>
<!--下面这个url-pattern标签位置写的是请求路径,随意编写,但要以/开头,不用添加项目的名称-->
<!--该请求路径是虚拟的路径,只是代表一个资源的名称,就是上面类的代号-->
<url-pattern>/zzw</url-pattern>
<!--url-pattern标签还可以编写多个,但都得以/开头且不需要添加项目名-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
保存,然后部署项目,启动Tomcat服务器,浏览器输入http://localhost:8080/ServletPrintToClient/zzw