韩顺平struts笔记.docx
《韩顺平struts笔记.docx》由会员分享,可在线阅读,更多相关《韩顺平struts笔记.docx(19页珍藏版)》请在冰点文库上搜索。
韩顺平struts笔记
Struts视频笔记:
Struts是一个开源的web框架,框架提高了程序的规范的同时也约束了程序员的自由
为什么会有struts:
因为我们队mvc理解的不同,可能造成不同公司写程序的时候,规范不统一,这样不利于程序的维护和扩展,所以我们有必要用一个统一的规范来开发项目(struts)
Struts的好处:
程序更加规范化,开发效率提高了,可读性增加了,程序的可维护性增加了
运行原理:
一个请求从浏览器发送给web服务器,http:
//localhost:
8080/web应用/action,web服务器首先解析主机→然后解析web应用的名称→在解析出资源名→转发给总司令ActionServlet(该类由struts框架提供给我们的无需编写,只需配置)→ActionServlet有一个文件struts-config.xml,该文件配置了表单actionForm(军火库),还配置了action,以及他们之间的对应关系,当ActionServlet拿到命令后它会查询struts-config.xml文件去填充数据,把用户的数据填充到表单里边,→下个动作就是去调用指定的action(小队长),action去从表单中读取数据,→调用某个model(士兵,如service)完成任务,→完成任务把结果返回给ActionServlet总司令(返回一个执行的结果),-->总司令又去查询struts-config.xml文件,决定跳转到哪个jsp页面,→返回一个执行结果(形成静态html文件)→直接返回给web服务器→服务器再把静态页面以http响应给浏览器
登录小项目过程步骤:
新建web工程→导入struts包→编写login.jsp→编写actionForm和action→配置struts-config.xml→编写ok.jsp和err.jsp→配置web.xml→测试
Struts.config.xml中的中的scope指的是actionform的生命周期范围struts中的scope默认是session
配置过滤器
publicclassMyFilterextendsHttpServletimplementsFilter{
@Override
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
arg0.setCharacterEncoding("gb2312");
arg1.setCharacterEncoding("gb2312");
arg2.doFilter(arg0,arg1);
}
配置web.xml
MyFilter
com.chao98.services.MyFilter
MyFilter
/*
上面这次比较浪费资源每次都要去实例化但是下面这种过滤器不太彻底,往数据库里插入数据时还是会经常出现乱码
publicclassMyFilterextendsHttpServletimplementsFilter{
privateStringencoding;
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
//arg0.setCharacterEncoding("gb2312");
//arg1.setCharacterEncoding("gb2312");
arg0.setCharacterEncoding(encoding);
arg2.doFilter(arg0,arg1);
}
publicvoidinit(FilterConfigarg0)throwsServletException{
encoding=arg0.getInitParameter("encoding");
}
然后在web.xml中加入
encoding
GB2312
配置struts-config.xml
xmlversion="1.0"encoding="UTF-8"?
>
xmlns="
xmlns:
xsi="http:
//www.w3.org/2001/XMLSchema-instance"
xsi:
schemaLocation="
action
org.apache.struts.action.ActionServlet
config
/WEB-INF/struts-config.xml
debug
2
detail
2
2
action
*.action
写一个关于安全性的过滤器,用于过滤一些用户注册使用的关键字
privateStringkeywords[];
publicvoiddoFilter(ServletRequestarg0,ServletResponsearg1,
FilterChainarg2)throwsIOException,ServletException{
Stringusername=arg0.getParameter("username");
System.out.println("thisissafefilter!
");
System.out.println(username);
if(username!
=null){
for(Stringkey:
keywords){
if(key.equals(username)){
arg0.setAttribute("err",username+"被第二个管理安全的过滤器拦截了");
arg0.getRequestDispatcher("/WEB-INF/tishi.jsp").forward(arg0,arg1);
return;
}
}
}
arg2.doFilter(arg0,arg1);
}
publicvoidinit(FilterConfigarg0)throwsServletException{
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("insertintouser(username,password)values("+"'"+u.getUsername()+"'"+","+"'"+u.getPassword()+"'"+")");
jstl(jspstartandtagliblary)jsp标准标签库:
可以提高开发速度,代码简洁
升级jsp页面
DOCTYPEHTMLPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
"http:
//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">替换8.5myeclipse:
D:
\Program\Files\Myeclipse\Common\plugins\com.genuitec.eclipse.wizards_8.5.0.me201003052220.jar\templates\jsp\jsp.vtl的
6.5myeclipse:
D:
\ProgramFiles\MyEclipse6.5\myeclipse\eclipse\plugins\com.genuitec.eclipse.wizards_6.5.0.zmyeclipse650200806\templates\jsp
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">这样比较符合现在的开发潮流
各个jstl标签
out>:
outvalue="helloworld">
out>
outvalue="${username}"default="没有值"escapeXml="false">
out>等同于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你们XX");
%>
这里有个优先级的问题,pageContext>request>session>application
outvalue="${hello}"default="没有值"escapeXml="false">
如果是在同一个页面,那么这段代码输出pageContext你们好XX
<%
Useru=newUser();
u.setUsername("admin");
u.setPassword("admin");
request.setAttribute("user",u);
%>
outvalue="${user.username}">
out>||outvalue="${user.password}">
out>
相当于(User)request.setAttribute("user").getUsername();
set>:
setvar="abc"value="中国,北京"scope="request">
set>
outvalue="${abc}"/>
removevar="abc"/>移除之后中国北京将不再显示
catch>:
catchvar="err">
<%inti=3/0;%>
catch>
outvalue="${err.message}">
out>
iftest="${2<30?
true:
false}">ok
if>
if>:
<%
request.setAttribute("a","hello");
request.setAttribute("age","22");%>
判断字符串:
iftest="${a=='hello'}">
hello
if>
判断数值
iftest="${age>12andage<30orage==22}">
年龄大于12小于30${age}
if><%
ArrayListal=newArrayList();
Useru1=newUser();
u1.setUsername("陈超");
u1.setPassword("tiger");
Useru2=newUser();
u2.setUsername("system");
u2.setPassword("manager");
al.add(u1);al.add(u2);
request.setAttribute("alluser",al);
%>
forEachitems="${alluser}"var="u">
${u.username}
${u.password}
forEach>
第一种迭代
forEachvar="i"begin="1"end="10">${i}
forEach>
第二种迭代
forEachvar="i"begin="1"end="10"step="3">${i}
forEach>
用于分隔字符:
forTokensitems="11;33;44;52;"delims=";"var="temp">${temp}
forTokens>
什么时候用$符,什么时候不用$
如果是从某个域对象中取出值,取的是一个变量就要用$,取的是一个固定的值就不要$
第一种:
Window.open(); 这种方式比较慢
第二种:
window.location.href=”/web应用名/goManager?
pageNow=”+pageNow
iftest="${pageNow>1}">前一页:
pageNow=${pageNow-1}”>
if>
当前页:
forEach>pageNow=${i}">[${i}]
forEach>
iftest="${pageNow后一页:
pageNow=${pageNow+1}”>
if>
当前页${pageNow}/总页数${pageCount}跳转到
<%
Mapmap=newHashMap();
//map.put("aa","admin");
//map.put("bb","scott");
Useru1=newUser();
u1.setUsername("xiaoming");
u1.setPassword("xiaoming");
Useru2=newUser();
u2.setUsername("xiaoming");
u2.setPassword("xiaoming");
map.put("u1",u1);
map.put("u2",u2);
request.setAttribute("person",map);
%>
forEachitems="${person}"var="per">
key:
${per.key}值name:
${per.value.username}值password:
${per.value.password}
forEach>
<%
Setset=newHashSet();
Useru3=newUser();
u3.setUsername("scott");
u3.setPassword("tiger");
set.add(u3);
request.setAttribute("setuser",set);
%>
forEachitems="${setuser}"var="myusers">
值name:
${myusers.username}值password:
${myusers.password}
iftest="${!
emptysetuser}">有人
if>
forEach>
重定向:
redirecturl=""/>
import标签:
importurl="a.jsp">
paramname="name"value="admin"/>
import>
Strtus标签:
baseref=""/>goto
如果没有给超链接设置则默认跳到XX(如上)
imagesrc="images/chadu.png">
image>这是一个图片按钮
imgsrc="images/chadu.png"/>这是真真正正的一i张图片
bean标签:
用于输出信息
<%
Useru1=newUser();
u1.setUsername("admin");
u1.setPassword("admin");
request.setAttribute("user",u1);
%>
writename="user"property="username">
write>
另外还有两种创建bean的方法,但是用的不多
defineid=""/>
define>
useBeanid="u2"class="com.chao98.forms.User">
useBean>
setPropertyname="u2"property="username"value="chenchao"/>
Logic标签:
logic标签使用
<%
Useru1=newUser();
u1.setUsername("admin");
u1.setPassword("aa");
Useru2=newUser();
u2.setUsername("tiger");
u2.setPassword("ac");
Useru3=newUser();
u3.setUsername("scott");
u3.setPassword("ab");
ArrayListal=newArrayList();
al.add(u1);
al.add(u2);
al.add(u3);
request.setAttribute("users",al);
%>
iterateid="user"name="users">
writename="user"property="username"/>
writename="user"property="password"/>
iterate>
emptyname="ee">
属性不存在
empty>
notEmptyname="users">
users属性存在
notEmpty>
iterateid="myusers"name="users">
greaterThanvalue="20"property="age"name="myusers">
年龄大于二十
greaterThan>
iterate>
标签的选择:
通常会选择el表达式$
opStruts第23讲:
开发struts的用户管理系统
Createtableusers(
Idintprimarykey,
Namevarchar(20)notnull,
Pwdvarchar(30)not