- IP:台主机都有的唯一的网络地址。IPV4:用4字节表示;IPV6:6字节
- 域名:主机名称,因为IP地址不好记而引入。如www.tsinghua.edu.cn.
- URI:统一资源标识符。包括URL与URN。由模式和模式特有部分组成。
- URL:统一资源定位器。由协议+DNS+端口号+资源名组成。如http://www.bai.com/index.html
- URN:统一资源名称,如ISBN:1565928709标识了一本书
web体系结构:
- 服务器
- 客户端
- 通信协议
web服务器
包括:
- 模型:javabeans
- 视图:jsp
- 控制器:servlet
- html页面
web容器
包括:
- servlet
- jsp
即servlet必须在web容器环境下运行。
MVC模型
- 模型:javabeans
- 视图:jsp
- 控制器:servlet
html,xml,css,javascript
- 超文本:html编写的文档可以插入其他文档或资源
- html:标记语言,用来描述如何格式化文档,即描述文档怎么在网站上显示。
- xml:可扩展标记语言,是html改进版,侧重对文档内容的描述。
- css:层叠样式表,样式美化
- javascript:用来给HTML网页添加动态功能,如响应用户的各种操作,对页面中的元素进行控制
Tomcat 服务器
tomcat目录结构及功能
webapps中的ROOT为默认的Web应用程序:即http://localhost:8080/
servlet简介
- web:网站
- servlet:小服务程序
- servlet是运行中web服务器或应用服务器上的应用程序,作为HTTP服务器和客户端的中间层
- localhost:本机ip地址,即127.0.0.1(共有6万五千多个端口号)
- MVC:模型视图控制
- JDBC:联系服务器和数据库的桥梁
- servlet服务程序:满足在服务器运行,java编写,有web服务器的就是
servlet任务:
- 从客户端获得HTML显示或 隐式请求数据
- 处理数据并计算出响应结果
- 发送HTML响应到客户端
静态网页和动态网页
- 静态网页:返回整个文档,就像是拍完照后直接原图发出
- 动态网页:根据请求计算处理返回,p过。
表单提交
表单提交是提交到action指示的页面
Servlet流程
- 客户端通过浏览器发送请求(get或post)
- 服务器接收请求,若是第一次接收,则调用init()初始化Servlet实例对象
- 调用service()函数,该函数判断调用doPost()还是doGet()
- Servlet产生动态回复
- 客户端响应回复
- myeclipse中web project、web service区别
web project 普通的B/S结构项目开发,如一些简单的网站、OA、CRM系统等。
web service 顾名思义就是web服务,它的作用就是为其他的项目提供服务。一般使用重量级的EJB进行开发。 这个一般很少用。
tomcat端口被占用
解决:
- 查看占用的进程,结束
- 在dos里输入:netstat -ano
- 找到8080端口号对应的pid号,然后在任务管理器中找到该进程结束即可
- tomcat报错:Failed to start component [StandardEngine[Catalina].StandardHost[localhost] caused by: The servlets named [AServlet] and [cn.itcast.servlet.AServlet] are both mapped to [/AServlet] which is not permitted
解决:servlet中的注释类annotation提供:
@WebServlet(name="/StudentServlet",urlPatterns={"/showStudent","/editStudent","/updateStudent","/insertStudent","/deleteStudent" ,"/addStudent"})
使得我们无需手动在配置web.xml文件中配置<servlet> </servlet>了,如果你已经在web.xml文件中配置了,可能会出现/servlet与两个服务程序关联报错。所以只需删除<servlet> </servlet>即可
调用service()函数,该函数判断调用doPost还是doGet
- 中文乱码问题
1、表单元素有中文,则jsp文件的编码方式得改:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2、服务器处理响应的结果中有中文,则java类的编码方式得改:
response.setContentType("text/html;charset=UTF-8");
3、在浏览器中提交数据时含有中文:
浏览器端发送请求参数使用的编码方式就是打开浏览器所用的编码方式(我的是UTF-8),但服务器接收参数后默认用ISO-8859-1编码,所以会存在中文乱码情况。
对于post请求,可以在doPost()方法中加上request.setCharacterEncoding("UTF-8");
改变getParameter()所得参数的编码方式;而get请求就得逐个改变每个参数字符串的编码方式:
String username=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
- Java项目下文件都没错,但项目名下有个红叉解决方法:
原因:jdk版本不统一导致,找到所有包含jdk的地方,修改成统一版本即可
1、java compiler
2、项目属性中project facets
3、windows菜单下属性中java compiler
实例(一):处理表单数据
具体:填写表单信息进行注册,注册成功后显示用户信息。
(1)写一个register.jsp页面
<body>部分如下,当点击提交按钮时,表单发送register.action请求给服务器。
<body>
<h3>用户注册</h3>
<form action="register.action" method="get">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" size="15"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" size="16"></td>
</tr>
<tr>
<td>性别:</td>
<td><input type="radio" name="sex" value="male">男
<input type="radio" name="sex" value="female">女</td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="age" size="5"></td>
</tr>
<tr>
<td>兴趣:</td>
<td><input type="checkbox" name="hobby" value="read">文学
<input type="checkbox" name="hobby" value="sport">运动
<input type="checkbox" name="hobby" value="computer">电脑</td>
</tr>
<tr>
<td>学历:</td>
<td>
<select name="education">
<option value="bachelor">学士</option>
<option value="master">硕士</option>
<option value="doctor">博士</option>
</select>
</td>
</tr>
<tr>
<td>邮件地址:</td>
<td><input type="text" name="email" size="20"></td>
</tr>
<tr>
<td>简历:</td>
<td><textarea cols="30" rows="5" name="resume"></textarea></td>
</tr>
<tr>
<td><input type="submit" value="提交"></td>
<td><input type="reset" value="重置"></td>
</tr>
</table>
</form>
</body>
(2)编写一个 FormServlet类继承 HttpServlet,重写doGet(),doPost()方法处理请求,这里处理表单请求用的方法是get方法。
doGet()方法:用getParameter()方法获取填写在表单中的数据,利用PrintWriter out = response.getWriter();
out.println("<HTML>");显示在浏览器上。
为防止乱码:String username=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
out.println("<HTML>");
out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
out.println(" <BODY><h1>"+title+"</h1>");
out.print(" <table> ");
out.print(" <tr><td>用户名</td>");
String username=new String(request.getParameter("username").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+username+"</td></tr>");
out.print(" <tr><td>密码</td>");
String password=new String(request.getParameter("password").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+password+"</td></tr>");
out.print(" <tr><td>性别</td>");
String sex=new String(request.getParameter("sex").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+sex+"</td></tr>");
out.print(" <tr><td>年龄</td>");
String age=new String(request.getParameter("age").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+age+"</td></tr>");
out.print(" <tr><td>兴趣</td>");
out.print(" <td>");
String hobbys[]=request.getParameterValues("hobby");
if(hobbys!=null){
for(String hobby:hobbys){
out.println(hobby+"<br/>");
}
}
out.print(" </td></tr>");
out.print(" <tr><td>学历</td>");
String education=new String(request.getParameter("education").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+education+"</td></tr>");
out.print(" <tr><td>邮箱</td>");
String email=new String(request.getParameter("email").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+email+"</td></tr>");
out.print(" <tr><td>简历</td>");
String resume=new String(request.getParameter("resume").getBytes("ISO-8859-1"),"UTF-8");
out.print(" <td>"+resume+"</td></tr>");
out.print(" </table>");
out.print("<div style='border:1px solid #ddd;'"+"'margin -top:40px;font-size:90%'>");
out.println(title+"<br/>");
Enumeration<String>parameterNames=request.getParameterNames();
while(parameterNames.hasMoreElements()){
String parameterName=new String(parameterNames.nextElement().getBytes("ISO-8859-1"),"UTF-8");
out.println(parameterName+":");
String[] paramValues=request.getParameterValues(parameterName);
for(String paramValue:paramValues){
out.println(new String(paramValue.getBytes("ISO-8859-1"),"UTF-8")+"<br/>");
}
}
out.println(" </div>");
out.println(" </BODY>");
out.println("</HTML>");
out.flush();
out.close();
}
(3)在web.xml文件中为Servlet与请求添加映射关系。或通过注释类:@WebServlet(name="FormServlet",urlPatterns="/register.action")//或将web.xml中改urlPatterns="/register.action"
等价于web.xml中:
<servlet>
<description>This is the description of my J2EE component</description>
<display-name>This is the display name of my J2EE component</display-name>
<servlet-name>FormServlet</servlet-name>
<servlet-class>com.lab.FormServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FormServlet</servlet-name>
<url-pattern>/register.action</url-pattern>
</servlet-mapping>
实例(二):实现Student对象简单管理
该web project只包含两个类,一个是Student类,一个为Servlet类。次例不用jsp页面,通过在浏览器中输入uri进入doGet()方法,在其中写入html代码,进入表单编写,再通过post()方法相应请求。
(1)定义一个Student类,存储对象属性。
package com.lab;
public class Student {
private String id;
private String name;
private int age;
private String qq;
public Student(String id,String name,int age,String qq){
this.id=id;
this.name=name;
this.age=age;
this.qq=qq;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getQq() {
return qq;
}
public void setQq(String qq) {
this.qq = qq;
}
}
(2)定义StudentServlet类,该类有3个操作函数:addStudent()增加一条学生信息、showStudent()显示所有学生信息、editStudent()修改某条学生信息。在该类中声明了一个list<Student>student变量,存取加入的学生。
首先@WebServlet(name="/StudentServlet",urlPatterns={"/showStudent","/editStudent","/updateStudent","/insertStudent","/deleteStudent"
,"/addStudent"})指定处理的请求形式。
doGet():String uri=request.getRequestURI();获取输入的请求uri,根据请求不同,调用不同的函数处理。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uri=request.getRequestURI();
if(uri.endsWith("showStudent")){
showStudent(response);
}else if(uri.endsWith("editStudent")){
editStudent(request,response);
}else if(uri.endsWith("addStudent")){
addStudent(request,response);
}
}
当在浏览器键入addStudent时,调用函数addStudent(request,response):
其中的html代码中定义了form表单,请求形式为insertStudent,方法为post,所以点确定按钮时会发送请求交由doPost()处理。
public void addStudent(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<html><head><title>添加学生信息</title></head>");
out.println("<body><p>添加学生信息</p>");
out.println("<form method='post' action='insertStudent'>");
out.println("<table><tr><td>学号</td><td><input type='text' name='id'/></td></tr>");
out.println("<tr><td>姓名</td><td><input type='text' name='name'/></td></tr>");
out.println("<tr><td>年龄</td><td><input type='text' name='age'/></td></tr>");
out.println("<tr><td>QQ</td><td><input type='text' name='qq'/></td></tr>");
out.println("<tr><td><input type='submit' value='确定'/></tr>");
out.println("</table></form></body></html>");
}
当在浏览器键入editStudent?id=1时,调用函数editStudent(request,response):
其中id=1为传入的参数:根据:String id=request.getParameter("id");获取要修改的学生id号
Student student =getStudent(id);
public void editStudent(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
String id=request.getParameter("id");
Student student =getStudent(id);
if(student!=null){
out.println("<html><head><title>修改学生信息</title></head>");
out.println("<body><p>修改学生信息</p>");
out.println("<form method='post' action='updateStudent'>");
out.println("<input type='hidden' name='id' value='"+id+"'/>");
out.println("<table><tr><td>姓名</td><td><input type='text' name='name' value='"+student.getName()+"'/></td></tr>");
out.println("<tr><td>年龄</td><td><input type='text' name='age' value='"+student.getAge()+"'/></td></tr>");
out.println("<tr><td>QQ</td><td><input type='text' name='qq' value='"+student.getQq()+"'/></td></tr>");
out.println("<tr><td><input type='submit' value='确定'/>" +
"</td><td><input type='reset' value='重置'/></td></tr>");
out.println("</table></form></body></html>");
}else{
out.println("没有找到学生!");
}
}
这两个函数中表单的请求由post()方法响应:
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String uri=request.getRequestURI();
response.setCharacterEncoding("UTF-8");
if(uri.endsWith("updateStudent")){
String id=request.getParameter("id");
Student student=getStudent(id);
if(student!=null){
String name=request.getParameter("name");
student.setName(name);
student.setAge(Integer.parseInt(request.getParameter("age")));
student.setQq(request.getParameter("qq"));
}
}else if(uri.endsWith("insertStudent")){
String id=request.getParameter("id");
String name=request.getParameter("name");
int age=Integer.parseInt(request.getParameter("age"));
String qq=request.getParameter("qq");
students.add(new Student(id, name, age, qq));
}
showStudent(response);
}
当在浏览器键入showStuden时,调用函数showStudent(request,response):显示所有学生信息,即把成语变量列表student的信息显示出。
这里用了init()函数,在服务器启动时就自动插入了两条记录:
public void init() throws ServletException {
Student stud1=new Student("101","王小明",23,"8899123");
Student stud2=new Student("102","张大海",20,"11223355");
students.add(stud1);
students.add(stud2);
}
public void showStudent(HttpServletResponse response) throws ServletException,IOException{
response.setContentType("text/html;charset=UTF-8");
PrintWriter out=response.getWriter();
out.println("<html><head><title>学生信息</title></head>");
out.println("<body><p>学生信息</p>");
out.println("<table>");
for(Student student:students){
out.println("<tr><td>"+student.getName()+"</td><td>"+student.getAge()+"</td><td>"+student.getQq()+"</td>"
+"<td><a href='editSrudent?id="+student.getId()+"'修改</a></td>"
+"<td><a href='deleteSrudent?id="+student.getId()+"'删除</a></td><tr>");
}
out.println("</table>");
out.println("</body></html>");
}