web学习笔记

本文详细介绍了Tomcat的配置步骤,包括hosts文件、server.xml与web.xml的设置,以及虚拟主机配置注意事项。还讲解了HTTP请求头和响应头的关键字段,以及Servlet的开发流程和生命周期。此外,涉及了MyEclipse中Servlet的创建、部署以及线程安全问题,以及如何通过ServletContext实现数据共享。最后,简述了JSP和Struts2的相关知识。
摘要由CSDN通过智能技术生成
Tomcat学习
1、C:\Windows\System32\drivers\etc\host里面配置访问主机IP对应域名
2、server.xml <Host name="www.ihlkang.com" appBase="c:\ihlkang">
<Context path="" docBase="c:\ihlkang\mail"/>
  </Host>
3、web.xml设置(缺省)访问首页


虚拟主机配置注意事项
1、C:\Windows\System32\drivers\etc\host里面配置访问主机IP对应域名
2、server.xml <Host name="www.ihlkang.com" appBase="c:\ihlkang">
<Context path="" docBase="c:\ihlkang\mail"/>
  </Host>
3、web.xml设置(缺省)访问首页


D:\apache-tomcat-7.0.72\conf tomcat-users.xml设置web应用访问
另外要把Servlet程序部署到Tomcat下,才能被访问到,因此需要配置
Tomcat路径下的Conf中的server,打开server文件在最后加上:
<Context docBase="E:\android_myeclipse\InfoSearch\WebRoot"
path="/mylogin"reloadable="true" debug="0"></Context>,
docBase后面是myeclipse的Web项目路径,path是虚拟路径,
在android程序中输入这个虚拟路劲即可访问到前面这个真实的路径,
reloadable可更新设置为真。这样保存退出即已完成服务端部署到Tomcat中了。


Http请求头
Accept:用于告诉服务器,客户机支持的数据类型
Accept-Charset:用于告诉服务器,客户机采用的编码
Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式
Accept-Language:客户机的语言环境
Host:客户机通过这个头告诉服务器想访问的主机名
If-Hodified-since:客户机通过这个头告诉服务器,资源的缓存时间
Referer:客户机通过这个头告诉服务器,它是从哪个资源访问服务器
User-Agent:客户机通过这个头告诉服务器,客户机的软件环境
Cookie
Connection:close/Keep-Alive
Date


Http响应
状态码:100~199接收成功
200~299成功接收,并完成整个处理过程,常用200
300~399请求的资源移动到一个新地址,常见302,307和304
400~499客户端请求有错,常见404 403
500~599服务器端有错误,常见500 
响应头
Location 这个头配合302状态码使用,用于告诉用户找谁
Server 这个头告诉浏览器服务器的类型
Content-Encoding 服务器通过这个头,告诉浏览器数据的压缩格式
//通知浏览器数据采用压缩格式 response.setHeader("Content-Encoding","gzip");
Content-Length 服务器告诉浏览器回送的数据长度
Content-Type 服务器告诉浏览器回送的数据类型
Last-Modified:服务器告诉浏览器当前资源缓存时间
Refresh:服务器通过这个头告诉浏览器隔多长时间刷新一次
Content-Disposition:服务器通过这个头,告诉浏览器以下载方式打开数据
Transfer-Encoding:服务器告诉浏览器数据的传送格式
ETag:缓存相应的头
Expires:服务器通过这个头,告诉浏览器把回送的资源缓存多长时间,-1或0,则是不缓存
Cache-Control:no-cache
Pragna:no-cache通过这两个头,服务器控制浏览器不缓存数据


Http请求头字段
Range头指示服务器只传输一部分web资源,可以用来实现断点传输:
URL url=new URL("http://localhost:8080/day04/a.txt");
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setRequestProperty("Range", "bytes=5-");

servlet
编写一个java类,实现servlet接口
把开发好的java类部署到web服务器

多看j2ee api文档


记事本练习编写servlet
1、 在C:\apache-tomcat-7.0.72\webapps下新建一个web应用day4.
2、 在day4下新建WEB-INF,在WEB-INF下新建classes目录,classes目录下新建一个FirstServlet.java文件
3、 编写代码,见源码文件
4、 编译,运行->cmd->cd\->cd C:\apache-tomcat-7.0.72\webapps\day4\WEB-INF\classes,这里需要注意,
***注意将tomcat lib目录下的servlet-api的jar包导入classpath中,
set classpath=%classpath%;C:\apache-tomcat-7.0.72\lib\servlet-api.jar
开始编译,javac -d . FirstServlet.java,编译完成生成一个.class文件
接下来给Web应用配置一个对外访问路径web.xml,***注意:web.xml文件要跟classes目录放在一起

servlet调用过程和生命周期
http://localhost:8080/day05/ServletDemo1
1.IE 连上服务器,2.发送http请求 3.web服务器解析出想访问的主机名,4.解析想访问的web应用,5.解析出想访问的web资源
6.第一次创建Servlet实例对象ServletDemo1,7.之后调用servlet的init方法完成对象初始化,8.创建代表请求的request
和代表响应的response,调用servlet的service方法,响应客户端请求。9.service方法执行,
向代表客户端响应的response对象写入了向客户机输出的数据:
OutputStream out=res.getOutputStream();
out.write("hello service"+getBytes());
10.service方法返回,11.服务器从response中取出数据,构建出http响应,回写给客户机
12.回写http响应,13.浏览器解析http响应,解析数据

servlet myeclipse开发
创建好ServletDemo类后导入Servlet api源码
window->preferences->myeclipse->servers->tomcat-7.x 注意Enable勾上
project deployments部署服务器
注意:启动服务器报错,可能是跑服务器的JDK版本过低,web工程是高版本编写的

Servlet接口实现类
GenericServlet、HttpServlet
HttpServlet指能够处理Http请求的servlet,它在原有Servlet接口上添加了一些与Http协议处理方法,
它比servlet接口的功能更为强大,编写代码时直接继承这个类,避免直接去实现servlet接口
HttpServlet在实现Servlet接口时,覆写了service方法,该方法体内的代码会自动判断用户的请求方式
,如Get请求,则调用HttpServlet的doGet方法,post请求,调用doPost方法,开发时通常只需要覆写doGet
或doPost()方法,而不去覆写service方法。
alt+左键,后退一步
代码中类名写错,可以Refactor,重构函数
servlet可以改成自己的模板:
进入安装目录找到\myeclipse10.7\Common\plugins\com.genuitec.eclipse.wizards.xxxx.jar
xxxx——是指版本有关的数值,不相同也没关系。选择文件,点击鼠标“右键”,选择“打开方式”。
然后选择压缩工具,如果没看到压缩工具,可以点击选择默认程序来查找。打开templates文件夹,
找到Servlet.java文件,将它拖到外面,使用editplus工具打开。然后你就可以修改doGet方法和
doPost方法,毕竟我们写Servlet程序大多都是重写这两个方法吗。可以把它的注解和out语句干掉。
注意别删错了,比如要是删多一个{,那么你myeclipse就出问题了。改好后保存拖回来覆盖原文件。
关闭就行了。修改之后,你以后创建Servlet文件只要重写doGet和doPost都会显示如下。
就没了之前那种多余的注解和out语句。


Servlet开发中一些细节
1.拷贝一份工程到myeclipse下,注意要改Web Context-root,在项目属性的MyEclipse下的Project Facets中的Web中修改。
2.servlet程序通过web.xml文件中的<servlet>元素和<servlet-mapping>元素完成。同一个servlet可以被多个url路径访问
3.由于context.xml中: <WatchedResource>WEB-INF/web.xml</WatchedResource>,时刻监控着web.xml,一旦web.xml发生
改动,tomcat服务器会自动重新加载。
4.*通配符:有冲突
5.web.xml中:<load-on-startup>2</load-on-startup>,表示服务器启动时提前创建好一个servlet,数字1代表优先级
数字越小优先级越高。
6. Tomcat服务器下的web.xml文件中默认访问路径,缺省的servlet,处理其它servlet都不处理的请求,报404错误给客户机:
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
7.线程安全问题:
静态变量会造成内存不足,注意完成操作需要释放静态变量。
解决方案:SingleThreadModel,通过创建新的servlet对象解决线程安全问题(不过该方法已经过时,不推荐使用)
synchronized可以解决线程安全问题,一个时刻只有一个用户访问,其它用户访问不了。
子类在覆盖父类的方法时,不能抛出比父类更多的异常。
用户访问网页,程序出错了,不能直接抛给用户,要把错误catch起来,在后台记录起来,给用户友好提示。

ServletConfig
在实际开发中,有些数据不适合在servlet中写死,这些数据可以通过配置方式配给servlet,例如servlet采用哪个码表,
servlet连接哪个库,servlet读取哪个配置文件:
在web.xml中设置键值对,在servlet中可以通过init(ServletConfig config)方法得到封装数据的ServletConfig对象。
<init-param>
    <param-name>data</param-name>
    <param-value>"hello web"</param-value>
    </init-param>

ServletContext
开发中可以通过,this.getServletConfig().getServletContext()
this.getServletContext();
拿到对象
ServletContext方法的应用
由于在一个Web应用中的所有Servlet共享同一个ServletContext对象,所以多个Servlet通过ServletContext对象实现数据共享
ServletContext对象通常也称之为context域对象(request session page)
1.这是一个容器
2.servletContext域这句话说明了这个容器的作用范围,也就是应用程序范围
为整个Web应用配置初始化参数
<context-param>
<param-name></param-name>
<param-value></param-value>
</context-param>
能实现servlet转发
注意:将数据传输给jsp,不能通过ServletContext,存在线程问题
ServletContext读取资源文件
InputStream in=this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
注意:千万千万别写成在你工程下面的路径,eclipse下面的src在服务器里面是没有的,/src/db.properties
路径肯定是找不到的,工程发布到服务器后,src就变成了classes,应该写在服务器的classes目录下的文件路径,该例是资源文件在src包下,
若资源文件在cn.itcast包下,则路径为:/WEB-INF/classes/cn/itcast/db.properties,若资源在WebRoot包下
则路径为:/db.properties
Properties props=new Properties();
props.load(in);
String url=props.getProperty("url");
另外可以通过ServletContext的getRealPath()得到资源的绝对路径,再通过传统的方式读取资源文件,见test4();

Web应用中普通java程序读取资源文件
如果读取资源文件的程序不是servlet的话,只能通过类装载器去读
InputStream in=UserDao.class.getClassLoader().getResourceAsStream("db.properties");
Properties pro=new Properties();
pro.load(in);
如果读取资源文件的程序不是servlet的话,只能通过类装载器去读
private static Properties dbconfig=new Properties();
static{
try{
得到类装载器,但该方法不能获取更新后的数据
InputStream in=UserDao.class.getClassLoader().getResourceAsStream("db.properties");
dbconfig.load(in);


如果要获取修改后的数据,就不能通过类装载器来读了,因为服务器启动后,类就创建了,存在内存
中,类装载器每次装开始的类,修改后的数据是不会获取到的,而且不能通过ServletContext来读
(ServletContext在上下两层间不能用),只能通过类装载方式读到文件的位置,再通过传统方式获取
更新后的数据
String path= UserDao.class.getClassLoader().getResource("db.properties").getPath();
FileInputStream in=new FileInputStream(path);
Properties dbconfig=new Properties();
dbconfig.load(in);
System.out.println(dbconfig.getProperty("url"));


HttpServletResponse对象服务器的响应,这个对象中封装了向客户端发送数据,发送响应头,发送响应状态码的方法。
在Servlet中用outputStream输出中文乱码问题:程序以什么码表输出,程序就要控制浏览器以什么码表打开
直接向浏览器发送中国这个字符串是不行的,写到reponse对象后,response是去ISO8859码表找,
找不到会返回两个问号??response把两个问号对应的数字发给浏览器,浏览器再去对应的码表去找这两个数字
对应的字符:两个问号
response.setCharacterEncoding("UTF-8");设置response使用的码表,以控制response以什么码表向浏览器写出数据
response.setHeader("content-type","text/html;charset=UTF-8");指定浏览器以什么码表打开服务器发送的数据

通过response下载文件
String path=this.getServletContext().getRealPath("/download/小黑.jpg");
String filename=path.substring(path.lastIndexOf("\\")+1);
//注意如果文件名有中文,文件名需要经过url编码
response.setHeader("content-disposition", "attachment;filename="
+URLEncoder.encode(filename,"UTF-8"));

输出随机认证码图片:
bufferedimage
TYPE_INT_BGR   表示一个具有 8 位 RGB 颜色分量的图像,对应于 Windows 或 Solaris 风格的 BGR 颜色模型,
具有打包为整数像素的 Blue、Green 和 Red 三种颜色。
代码见day06工程的ResponseDemo4.
myeclipse小写大写转换可以在window->preferences->Keys(to upper case转换为大写,to lower case转换为小写)

response控制浏览器缓存
response.setDateHeader("expires", System.currentTimeMillis()+1000*3600);//当前时间加上需要缓存的时间
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type", "text/html;charset=UTF-8");
String data="随机过程";
response.getWriter().write(data);


response实现请求重定向
重定向特点是浏览器会向服务器发两次请求,意味着有两个request/response;
用户登录和显示购物车时会用到重定向,一般能不使用就不使用;
使用重定向,地址栏会发生变化;
response.setStatus(302);
response.setHeader("location", "/day06/index.jsp");
response.sendRedirect("/day06/index.jsp");

注意:response的getOutputStream方法和getWrite方法不能同时调用,会抛异常;

Request常用方法
request.getRequestURL(),返回
request.getRequestURI()方法,可用于用户权限管理,通过查看用户访问的资源,判断用户是否有查看权限,有则放行,
没有则过滤,还可用于统计用户访问的页面次数和访问各个网址的次数等情景;
request.getQueryString()返回请求行中的参数部分
getRemoteAddr返回请求的客户机的IP地址
getRemoteHost返回客户机的完整主机名
getRemotePort返回客户机所使用的网络端口号
getLocalAddr返回web服务器的IP地址
getLocalHost返回web服务器的完整主机名
getMethod得到客户机的请求方式

Request获取请求头和请求数据

对于浏览器提交的表单数据,一定要确定服务器端程序的健壮性,用软件思想:数据一定要先检查再使用

Request实现请求转发
    转发不会创建新的request,response
客户端只发出一次请求,而服务端有多个资源调用
客户端浏览地址栏没变化
String data="aa";
request.setAttribute("data",data);
request.getRequestDispacher("/message.jsp").forward(request,response);
转发数据不能用this.getServletContext(),由于context是共享的,你转发data过程中,可能有另一个客户端
也在转发data,他的data数据又和你的不一样,把前面用户的数据覆盖了。
message.jsp :${data}或者 
<%
    String data=(String)request.getAttribute("data");
    out.write(data);
     %>
MVC:m model javaBean  v view(jsp) c control(servlet)
转发细节:跳转之前不能关闭response,即
1、
PrintWriter write=response.getWriter();
write.write(data);
write.close();
request.getRequestDispatcher("/message.jsp").forward(request, response);
2、
if(true){
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
request.getRequestDispatcher("/message.jsp").forward(request, response);
这两种种情况,转发无法进行,可以在if(){}中加一个return解决,但是后面的转发无法进行

forward的细节
forward时,会清空response中的数据


Request的include方法
用include实现页面包含,通常是在jsp中实现页面包含的,知道有这个技术就行了,不建议采用
见RequestDemo6


Web工程中各类地址的写法
request.getRequestDispatcher("/form.html").forward(request, response);

response.sendRedirect("/day06/form.html");

this.getServletContext().getRealPath("/form.html");

this.getServletContext().getResourceAsStream("/public/foot.jsp");
/*
<a href="/day06/form.html">点滴</a>
<form action="/day06/form.html">
</form>
*/
服务端获取资源,使用/代表web应用,加应用下的资源文件
客户端浏览器获取资源,使用/代表网站,加网站下的day06/form.html

refer防盗链
response.setCharacterEncoding("UTF-8");
response.setHeader("content-type","text/html;charset=UTF-8");
String referer=request.getHeader("referer");
if(referer==null || !referer.startsWith("http://localhost")){
response.sendRedirect("/day06/note.jsp");
return;
}
String data="日记";
response.getWriter().write(data);
防止用户不看首页直接看日记,通过判断之后重定向到首页

会话管理

商品浏览历史记录
见CookieDemo3,CookieDemo4

客户端防表单重复注册


JSP学习
脚本表达式输出
查看jsp对应的java代码可以看到jsp生成的java代码->C:\apache-tomcat-7.0.72\work\Catalina\localhost\day08\org\apache\jsp
多个脚本片段间是可以互相访问的
一般是servlet处理请求,jsp做输出
<%-- --%>jsp注释,
<!-- --!>html注释,虽然html可以注释,但会把数据发给浏览器的,比较之下jsp注释更好

改jsp模板
C:\Users\Administrator\MyEclipse Professional\plugins下的com.genuitec.eclipse.wizards_11.0.0.me201308081637 jar文件,进入
templates中的jsp文件夹,找到JSp.vtl文件,复制到桌面将其中内容改为自己需要的,然后保存复制到jar文件中

<page >
session 可置为true or false

isThreadSafe jsp线程安全,置为false即为线程安全的,接口为SingleThreadModel
errorPage=“url” jsp错误处理页面,url必须使用相对路径,如果以/开头,表示相对于当前web应用程序的根目录
也可以在web-xml中全局配置出错友好提示


Hibernate学习
创建数据库驱动连接
单击右上角的编辑模式,选择Myeclipse Database Explorer。
hbm.xml中主键的generator属性值可以设为assigned和native两种,assigned是手工赋值,native是自动增加。
hbm.xml中的日期类型,type可以设为date,time,java.util.date,timeStamp(时间戳)等几种类型。
Mysql不支持标准SQL的CLOB类型,在Mysql中,用text,mediumtext及longtext类型来表示长度超过255
的长文本数据。
mysql中储存blob二进制数据文件:

Mysql数据库中文乱码问题
navicat属性->高级中将使用mysql字符集勾上
mysql字符集安装时设置为utf-8编码




struts2学习
struts.xml配置文件
web.xml中加入过滤器和映射
拦截器需要这struts.xml加入注册和引用两部分。
struts-default.xml中定义了一个defaultStack拦截器,并将其指定为默认拦截器,当为包中的某个action显示指定了某个拦截器,则默认拦截器不会起作用。
拦截器栈中的各个拦截器的顺序很重要。
<constant>禁用动态方法启动为false。
好好看看项目struts-auth:通过拦截器实现登录功能






















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值