文档库 最新最全的文档下载
当前位置:文档库 › strusts经典笔记之韩顺平

strusts经典笔记之韩顺平

strusts经典笔记之韩顺平
strusts经典笔记之韩顺平

Struts视频笔记:(成就超凡)

Struts是一个开源的web框架,框架提高了程序的规范的同时也约束了程序员的自由

为什么会有struts:因为我们对mvc理解的不同,可能造成不同公司写程序的时候,规范不统一,这样不利于程序的维护和扩展,所以我们有必要用一个统一的规范来开发项目(struts)

Struts 的好处: 程序更加规范化,开发效率提高了,可读性增加了,程序的可维护性增加了

运行原理:

一个请求从浏览器发送给web服务器,http://localhost:8080/web应用/action,web服务器首先解析主机然后解析web应用的名称在解析出资源名转发给总司令ActionServlet(该类由struts框架提供给我们的无需编写,只需配

置有一个文件struts-config.xml,该文件配置了表单actionForm(军火库),还配置了action,以及他们之间的对应关系,当ActionServlet拿到命令后它会查询struts-config.xml文件去填充数据,把用户的数据填充到表单里边下个动作就是去调用指定的action(小队长),action去从表单中读取数据调用某个model(士兵,如service)完成任务完成任务把结果返回给ActionServlet总司令(返回一个执行的结果),-->总司令又去查询struts-config.xml文件,决定跳转到哪个jsp 页面返回一个执行结果(形成静态html文件直接返回给web服务器服务器再把静态页面以http响应给浏览器

,登录小项目过程步骤: 新建web工程导入struts包编写编写actionForm和配置struts-编写ok.jsp和配置

测试

Struts.config.xml中的中的scope指的是actionform的生命周期范围struts中的scope默认是session

配置过滤器

public class MyFilter extends HttpServlet implements Filter {

@Override

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {

arg0.setCharacterEncoding("gb2312");

arg1.setCharacterEncoding("gb2312");

arg2.doFilter(arg0, arg1);

}

配置web.xml

MyFilter

com.chao98.services.MyFilter

MyFilter

/*

上面这次比较浪费资源每次都要去实例化但是下面这种过滤器不太彻底,往数据库里插入数据时还是会经常出现乱码

public class MyFilter extends HttpServlet implements Filter {

private String encoding;

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {

// arg0.setCharacterEncoding("gb2312");

//arg1.setCharacterEncoding("gb2312");

arg0.setCharacterEncoding(encoding);

arg2.doFilter(arg0, arg1);

}

public void init(FilterConfig arg0) throws ServletException {

encoding=arg0.getInitParameter("encoding");

}

然后在web.xml中加入

encoding

GB2312

配置struts-config.xml

xmlns="https://www.wendangku.net/doc/b09612043.html,/xml/ns/javaee"

xmlns:xsi="https://www.wendangku.net/doc/b09612043.html,/2001/XMLSchema-instance"

xsi:schemaLocation="https://www.wendangku.net/doc/b09612043.html,/xml/ns/javaee

https://www.wendangku.net/doc/b09612043.html,/xml/ns/javaee/web-app_2_5.xsd">

action

org.apache.struts.action.ActionServlet

config

/WEB-INF/struts-config.xml

debug

2

detail

2

2

action

*.action

写一个关于安全性的过滤器,用于过滤一些用户注册使用的关键字

private String keywords[];

public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException {

String username=arg0.getParameter("username");

System.out.println("this is safe filter !");

System.out.println(username);

if(username!=null){

for(String key:keywords){

if(key.equals(username)){

arg0.setAttribute("err", username+"被第二个管理安全的过滤器拦截了");

arg0.getRequestDispatcher("/WEB-INF/tishi.jsp").forward(arg0, arg1);

return ;

}

}

}

arg2.doFilter(arg0, arg1);

}

public void init(FilterConfig arg0) throws ServletException {

keywords=arg0.getInitParameter("keywords").split(";");

}

然后在web.xml配置过滤器还有设置要过滤的关键字

keywords

xiaomao;xiaoxiao

每个action是单态的,包括actionserver,对网站并发性有影响若要证明的话在***action.java中声明一个静态变量,每次访问自加

什么是单态: 单态是指在整个运行过程中,始终是一个对象;

struts-config.xml默认放在WEB-INF目录下,也可以放到其他地方,只需要在web.xml中的

config

/WEB-INF/struts-config.xml

有多个struts-config.xml只需用","号隔开

java 中插入数据库的语句需要注意标点st.executeUpdate("insert into user(username,password)

values("+"'"+u.getUsername()+"'"+","+"'"+u.getPassword()+"'"+")");

jstl(jsp startand tag liblary) jsp标准标签库: 可以提高开发速度,代码简洁

升级jsp 页面

"https://www.wendangku.net/doc/b09612043.html,/TR/xhtml1/DTD/xhtml1-transitional.dtd">替换8.5myeclipse: D:\Program\Files\Myeclipse\Common\plugins\com.genuitec.eclipse.wizards_8.5.0.m e201003052220.jar\templates\jsp\jsp.vtl的

6.5myeclipse:D:\ProgramFiles\MyEclipse6.5\myeclipse\eclipse\plugins\com.genuitec .eclipse.wizards_6.5.0.zmyeclipse650200806\templates\jsp

这样比较符合现在的开发潮流

各个jstl标签

:

等同于request.getAttribute("user").toString();

escapeXml表示是否安装html样式显示默认是true:表示以文本显示

如何输出request,session,application, pageContext域对象的数据

<%

request.setAttribute("hello","request你好!");

session.setAttribute("hello","session你好!");

application.setAttribute("hello","application你好");

pageContext.setAttribute("hello","pageContext你们百度");

%>

这里有个优先级的问题,pageContext>request>session>application

如果是在同一个页面,那么这段代码输出pageContext你们好百度

<%

User u=new User();

u.setUsername("admin");

u.setPassword("admin");

request.setAttribute("user",u);

%>

| |

相当于(User) request.setAttribute("user").getUsername();

:

移除之后中国北京将不再显示

:

<%int i=3/0; %>

ok

:

<%

request.setAttribute("a","hello");

request.setAttribute("age","22"); %>

判断字符串:

hello

判断数值

年龄大于12 小于30 ${age }

<%

ArrayList al=new ArrayList();

User u1=new User();

u1.setUsername("陈超");

u1.setPassword("tiger");

User u2=new User();

u2.setUsername("system");

u2.setPassword("manager");

al.add(u1); al.add(u2);

request.setAttribute("alluser",al);

%>

${https://www.wendangku.net/doc/b09612043.html,ername}

${u.password}

第一种迭代

${i}  


第二种迭代

${i}  

用于分隔字符:${temp}

什么时候用$符,什么时候不用$

如果是从某个域对象中取出值,取的是一个变量就要用$ ,取的是一个固定的值就不要$

第一种:Window.open();这种方式比较慢

第二种:window.location.href=”/web应用名/goManager?pageNow=”+pageNow 前一页:

当前页:[${i }]

后一页:

当前页${pageNow } /总页数${pageCount } 跳转到

<%

Map map=new HashMap();

//map.put("aa","admin");

// map.put("bb","scott");

User u1=new User();

u1.setUsername("xiaoming");

u1.setPassword("xiaoming");

User u2=new User();

u2.setUsername("xiaoming");

u2.setPassword("xiaoming");

map.put("u1",u1);

map.put("u2",u2);

request.setAttribute("person",map);

%>

key:${per.key }值name: ${https://www.wendangku.net/doc/b09612043.html,ername }值password:${per.value.password }

<%

Set set=new HashSet();

User u3=new User();

u3.setUsername("scott");

u3.setPassword("tiger");

set.add(u3);

request.setAttribute("setuser" ,set);

%>

值name: ${https://www.wendangku.net/doc/b09612043.html,ername }值password:${myusers.password }

有人

重定向:

import标签:

Strtus标签:

goto

如果没有给超链接设置则默认跳到百度(如上)

这是一个图片按钮这是真真正正的一i张图片

bean标签: 用于输出信息

<%

User u1=new User();

u1.setUsername("admin");

u1.setPassword("admin");

request.setAttribute("user",u1);

%>

另外还有两种创建bean的方法,但是用的不多

Logic 标签:

logic标签使用

<%

User u1=new User();

u1.setUsername("admin");

u1.setPassword("aa");

User u2=new User();

u2.setUsername("tiger");

u2.setPassword("ac");

User u3=new User();

u3.setUsername("scott");

u3.setPassword("ab");

ArrayList al=new ArrayList();

al.add(u1);

al.add(u2);

al.add(u3);

request.setAttribute("users",al);

%>


属性不存在

users属性存在

年龄大于二十

标签的选择: 通常会选择el表达式$

op Struts 第23讲: 开发struts 的用户管理系统

Create table users (

Id int primary key,

Name varchar(20) not null,

Pwd varchar(30) not null,

Email varchar(30) not null,

Tel varchar(30) not null,

Grade int default 1 not null

)

如果中文不能加入的话show variables like ‘%char%’;

Set character_set_client=gbk

注销退出登录

request.getSession().invalidate(); //会把所有的session都删除

return mapping.findForward("logout");

动态表单(dynimic form):当我们表单个数和类型不确定的情况下,我们就可以使用动动态表单来解决

动态表单和普通表单的区别:

1普通表单actionForm 是首先你需要定义这样一个类,然后配置到struts-config 中,

2,动态表单完全依赖反射机制创建,所以不要去定义表单类,直接在struts-config.xml中配置即可

typ e=”org.apache.struts.action.DynaActionForm”>

文件的上传与下载

读取文件(inputStream)写文件(outputStream);

案例项目:

1:

name:

photo:

2:

public class UserForm extends ActionForm {

private String username;

private FormFile myphoto;

public String getUsername() {

return username;

}

public void setUsername(String username) {

https://www.wendangku.net/doc/b09612043.html,ername = username;

}

public FormFile getMyphoto() {

return myphoto;

}

public void setMyphoto(FormFile myphoto) {

this.myphoto = myphoto;

}

3:

public ActionForward execute(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response) {

UserForm userForm=(UserForm)form;

String username=userForm.getUsername();//取出用户名字

FormFile formFile=userForm.getMyphoto();

// 通过FormFile 我们可以获取关于上次文件的各种信息

String fileName=formFile.getFileName();

int fileSize=formFile.getFileSize();

System.out.println("文件名称:"+fileName);

System.out.println("文件大小:"+fileSize);

InputStream is=null;

OutputStream os=null;

try {//取出输入流

is=formFile.getInputStream();

//得到输出流--文件

// 1 得到file文件夹上传到tomcat服务器后的绝对路径

String

keepFilePath=this.getServlet().getServletContext().getRealPath("file");

System.out.println(keepFilePath);//打印路径

os=new FileOutputStream(keepFilePath+"\\"+fileName);//读取文件并写出到服务器file

int len=0;//缓存

byte []bytes=new byte[1024];

//循环处理

while((len=is.read(bytes))>0){

os.write(bytes,0,len);//读一点写一点

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return null;

}

4:在webroot下建立一个file文件夹

完善struts文件上传(上面这种如果上传文件名相同的文件的话就会被覆盖

首先了解uuid 的简单使用方法:

String uuids=(java.util.UUID.randomUUID()).toString();

面试题subString(int beginindex,int endindex);是如何截取的: 获取字符串的一个子串,从beginindex包扩beginindex 取到endindex ,但是不包括endindex 如String subString="helloworld!";

System.out.println(subString.substring(0,5));

//打出hello beginindex是从0开始的

优化后的代码为

public class RegisterAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) {

UserForm userForm=(UserForm)form;

String username=userForm.getUsername();//取出用户名字

FormFile formFile=userForm.getMyphoto();

// 通过FormFile 我们可以获取关于上次文件的各种信息

String fileName=formFile.getFileName();

String newFileName="";

int beginIndex=https://www.wendangku.net/doc/b09612043.html,stIndexOf(".");

String uuid=(java.util.UUID.randomUUID()).toString();

newFileName=uuid+fileName.substring(beginIndex,

fileName.length());

int fileSize=formFile.getFileSize();

System.out.println("uuid:"+uuid);

System.out.println("文件名称:"+fileName);

System.out.println("新文件名称:"+newFileName);

System.out.println("文件大小:"+fileSize);

InputStream is=null;

OutputStream os=null;

try {//取出输入流

is=formFile.getInputStream();

//得到输出流--文件

// 1 得到file文件夹上传到tomcat服务器后的绝对路径

String

keepFilePath=this.getServlet().getServletContext().getRealPath("file");

System.out.println(keepFilePath);//打印路径

os=new FileOutputStream(keepFilePath+"\\"+newFileName);//读取文件并写出到服务器file

int len=0;//缓存

byte []bytes=new byte[1024];

//循环处理

while((len=is.read(bytes))>0){

os.write(bytes,0,len);//读一点写一点

return mapping.findForward("loginok");

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

return mapping.findForward("loginerr");

}

}

注意事项:如果文件名是中文怎么办?

做一个过滤器

arg0.setCharacterEncoding("UTF-8");

arg1.setCharacterEncoding("UTF-8");

arg2.doFilter(arg0, arg1);

案例: 保存到数据库中

Create database userdb2;

Use userdb2;

Create table t_users

(username varchar(30) unique not null,

myphoto varchar(128) not null,##保存新的文件名

myphoto2 varchar(128) not null ##保存旧的文件名

);

Q:1272307737

文件下载

如果下载的文件时中文名那么我们需要在action中对其进行处理

String filterFilkename=https://www.wendangku.net/doc/b09612043.html,.URLEncoder.encode(u.getMyphoto(),"GB2312");

思考: 如何控制文件的大小?

如何控制文件上传类型?

可以从D:\Program Files\Tomcat 6.0\conf目录下的web.xml中可以查看文件的类型

如何防止用户名重复?

韩顺平html笔记

HTML 一、HTML有关知识点 1.html介绍 html是一种标记语言,主要的用途是开发网页,使用html可以展现文字、图片、视频、声音,html是我们web开发(网站开发)。 2.html可以做什么 ?html可以编写静态网页 ?该静态网页可以包括文字、图像、动画、声音、表格、链接。从而构成一个个漂亮的网页 3.Html发展历史 4.Html的基本结构 5.是标记(也叫元素),标记的一般格式: <元素名[属性=“属性值”]>元素内容 如果没有内容可以用:<元素名[属性=“属性值”]/> 6.Html实体标记 7.Html常用标记

?html超链接 ●_blank 新的窗口 ●_self 本窗口 ●_parent 父窗口 ●_top整个浏览器窗口 ?html图像元素 ?html表格

--用于说明行 --用于说一小格
?无序列表
?有序列表
?框架 ?表单元素 文本框: 密码框: 单选框: 复选框:checked是指默认选中的 隐藏域: 图片按钮: ?文本域: ?下拉菜单: 案例:1 需求:打开网页后,显示hello !

New Document 问题: ?js的位置可以随意放 ?js必须使用 ?在一个html文件中(JSP/PHP/https://www.wendangku.net/doc/b09612043.html,)可以出现多对(script)片段,浏览器会按照先后顺序一次执行 案例2:Hello world程序改进 ?如何定义变量: ?如何运算: New Document ?Js的变量类型是怎样决定的 1)Js是弱数据类型语言,即:在定义变量侍候,统一使用var表示,甚至可以去点var 这个关键字 2)Js中的变量的数据是由js引擎决定的 Var name=”shunping”; //name是字符串 Var kk=2 //kk是数字 Name=234; //这事name自动变成数 ?Js的命名规(函数/变量): 1)使用大小写字母,数字,$可以命名 2)不能以数字打头 3)不能使用js保留字和关键字(即java里的关键字) 4)区分大小写

韩顺平html+css+js之JS笔记

韩顺平html+css+js 之JS笔记 Javascript的基本介绍 ?JS是用于WEB开发的脚本语言: ?脚本语言是什么: ?脚本语言不能独立使用,它和HTML/JSP/PHP/https://www.wendangku.net/doc/b09612043.html,配合使用 ?脚本语言也有自己的变量,函数,控制语句(顺序,分支,循环) ?脚本语言实际上是解释性语言(即在执行时直接对源码进行执行) ?Java程序.java→.class→jvm , js→浏览器(js引擎来解释执行) ?Js在客户端(浏览器)执行 ?因为js是由浏览器来执行的,因此这里有个问题,不同类型的浏览器可能对js的支持不一样。 New Document 案例:1 需求:打开网页后,显示hello !

New Document 问题: ?js的位置可以随意放 ?js必须使用 ?在一个html文件中(JSP/PHP/https://www.wendangku.net/doc/b09612043.html,)可以出现多对(script)片段,浏览器会按照先后顺序一次执行 案例2:Hello world程序改进 ?如何定义变量: ?如何运算: New Document ?Js的变量类型是怎样决定的 1) Js是弱数据类型语言,即:在定义变量侍候,统一使用var表示,甚至可以去点var这 个关键字 2) Js中的变量的数据是由js引擎决定的 Var name=”shunping”; //name是字符串 Var kk=2 //kk是数字 Name=234; //这事name自动变成数 ?Js的命名规范(函数/变量): 1) 使用大小写字母,数字,$可以命名 2) 不能以数字打头 3) 不能使用js保留字和关键字(即java里的关键字) 4) 区分大小写 5) 单行注释:// 6) 多行注释:/*…….*/ 韩顺平JS第三讲

jquery学习笔记-韩顺平

1,Jquery是一个javascript框架或者叫做javascript库; 2,用Ajax我们可以给服务器发送一个请求,服务器可以给我回送一个请求; 3,出现javascript框架的根本原因就是为了提高开发者的开发效率; 4,jquery是一个轻量级的js库(压缩后只有21K),这是其他的js库所不及的,它兼容CSS3,还兼容各种浏览器; 5,JQuery是一个快速的,简洁的javascript库,使用户能更方便的处理HTML document,events,实现动画效果,并且方便的为网站提供AJAX交互; 6,JQuery还有一个比较大的优势是,它的文档说明很全,而且各种应用也说得很详细,同时还有许多成熟的插件可供选择。 7,jquery能够使用户的html页保持代码和html内容的分离,也就是说,不用再在html里面插入一堆js来调用命令了,只需定义id即可; 8,所谓的库就是提供一些现成的方法供你去调用; 9,当前流行的javascript库有: Jquery ,MooTools,Prototype,Dojo,YUI,EXTJS,DWR[主要是运行在服务器上的]; 10,$(document) //---这个表示一个jquery对象; 11,如果使用jquery,则需要引入jquery库 12,jquery对象就是对dom对象的一系列包装,它包装完成后,就可以使用jquery对象提供的方法来进行操作; 13,在使用jquery开发中,有两种对象,1,jquery对象,2,dom对象,如果是jquery对象则只能使用jquery库提供的方法,如果是dom对象,则只能使用js本身提供的方法; 14,分析jquery库文件的运行原理: