不会做美工,,so ,界面很丑。
com.blog.domain
Article.java
1 package com.blog.domain;
2
3 import java.io.Serializable;
4 import java.sql.Timestamp;
5
6 public class Article implements Serializable {
7
8 /**
9 *
10 */
11 private static final long serialVersionUID = 1L;
12
13 private Integer id;
14 private String title;
15 private String contents ;
16 private Character type; //O->原创; R->转载;T->翻译
17 private User user;
18 private Timestamp postTime;
19
20
21 public Article() {
22 }
23 public Article(String title, String contents, Character type,
24 User user) {
25 super();
26 this.title = title;
27 this.contents = contents;
28 this.type = type;
29 this.user = user;
30 }
31 public Timestamp getPostTime() {
32 return postTime;
33 }
34 public void setPostTime(Timestamp postTime) {
35 this.postTime = postTime;
36 }
37 public Integer getId() {
38 return id;
39 }
40 public void setId(Integer id) {
41 this.id = id;
42 }
43 public String getTitle() {
44 return title;
45 }
46 public void setTitle(String title) {
47 this.title = title;
48 }
49 public String getContents() {
50 return contents;
51 }
52 public void setContents(String contents) {
53 this.contents = contents;
54 }
55 public Character getType() {
56 return type;
57 }
58 public void setType(Character type) {
59 this.type = type;
60 }
61 public User getUser() {
62 return user;
63 }
64 public void setUser(User user) {
65 this.user = user;
66 }
67
68 }
User.java
1 package com.blog.domain;
2
3 import java.io.Serializable;
4 import java.util.Set;
5
6 public class User implements Serializable{
7 /**
8 *
9 */
10 private static final long serialVersionUID = 1L;
11
12 private Integer id;
13 private String userName;
14 private String passwd;
15 private Character sex;
16 //头像路径
17 private String portrait;
18 private Set<Article> userArt;
19
20
21 public User(String userName, String passwd, Character sex,
22 String portrait) {
23 super();
24 this.userName = userName;
25 this.passwd = passwd;
26 this.sex = sex;
27 this.portrait = portrait;
28 }
29 public User(Integer id, String passwd) {
30 super();
31 this.id = id;
32 this.passwd = passwd;
33 }
34 public User(){}
35 public Integer getId() {
36 return id;
37 }
38 public void setId(Integer id) {
39 this.id = id;
40 }
41 public String getUserName() {
42 return userName;
43 }
44 public void setUserName(String userName) {
45 this.userName = userName;
46 }
47 public String getPasswd() {
48 return passwd;
49 }
50 public void setPasswd(String passwd) {
51 this.passwd = passwd;
52 }
53 public Character getSex() {
54 return sex;
55 }
56 public void setSex(Character sex) {
57 this.sex = sex;
58 }
59 public String getPortrait() {
60 return portrait;
61 }
62 public void setPortrait(String portrait) {
63 this.portrait = portrait;
64 }
65 public Set<Article> getUserArt() {
66 return userArt;
67 }
68 public void setUserArt(Set<Article> userArt) {
69 this.userArt = userArt;
70 }
71
72
73
74
75 }
Article.hbm.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <hibernate-mapping package="com.blog.domain">
5 <class name="Article" table="Articles" lazy="true">
6 <id name="id" type="java.lang.Integer">
7 <generator class="native"></generator>
8 </id>
9 <!--设置默认值为当前时间 -->
10 <timestamp name="postTime" column="postTime"></timestamp>
11 <property name="contents" type="text">
12 <column name="contents" ></column>
13 </property>
14 <!-- <property name="postTime" type="date" >
15 <column name="postTime" ></column>
16 </property> -->
17 <property name="title" type="text">
18 <column name="title"></column>
19 </property>
20 <property name="type" type="character">
21 <column name="type"></column>
22 </property>
23 <many-to-one name="user" column="user_id"> </many-to-one>
24 </class>
25
26 </hibernate-mapping>
User.hbm.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
3 "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
4 <hibernate-mapping package="com.blog.domain">
5 <class name="User" table="Users" lazy="true">
6 <id name="id" type="java.lang.Integer">
7 <generator class="native"></generator>
8 </id>
9 <property name="userName" type="java.lang.String" not-null="true">
10 <column name="userName" length="32"></column>
11 </property>
12 <property name="passwd" type="java.lang.String" not-null="true">
13 <column name="passwd" length="32"></column>
14 </property>
15 <property name="portrait" type="java.lang.String">
16 <column name="portrait" length="512"></column>
17 </property>
18 <property name="sex" type="java.lang.Character">
19 <column name="sex"></column>
20 </property>
21 <set name="userArt">
22 <key column="user_id"></key>
23 <one-to-many class="Article"/>
24 </set>
25 </class>
26
27 </hibernate-mapping>
com.blog.service.base
BaseServiceImp.java
1 package com.blog.service.base;
2
3 import java.io.Serializable;
4 import java.util.List;
5
6 import org.hibernate.Query;
7 import org.hibernate.SessionFactory;
8 import org.springframework.transaction.annotation.Transactional;
9
10 @Transactional
11 public class BaseServiceImp implements BaseServiceInter {
12 private SessionFactory sessionFactory;
13
14 public SessionFactory getSessionFactory() {
15 return sessionFactory;
16 }
17
18 public void setSessionFactory(SessionFactory sessionFactory) {
19 this.sessionFactory = sessionFactory;
20 }
21
22 @SuppressWarnings("rawtypes")
23 @Override
24 public Object findById(Class clazz, Serializable id) {
25 // TODO Auto-generated method stub
26 return sessionFactory.getCurrentSession().get(clazz, id);
27 }
28
29 @Override
30 public void delObj(Object obj) {
31 // TODO Auto-generated method stub
32 sessionFactory.getCurrentSession().delete(obj);
33 }
34
35 @SuppressWarnings("rawtypes")
36 @Override
37 public List executeQuery(String hql, Object[] parameters) {
38 // TODO Auto-generated method stub
39
40 Query query=this.sessionFactory.getCurrentSession().createQuery(hql);
41
42 //注入?值
43 if(parameters!=null && parameters.length>0){
44 for(int i=0;i<parameters.length;i++){
45 query.setParameter(i, parameters[i]);
46
47 }
48 }
49
50 return query.list();
51 }
52
53 @Override
54 public Object uniqueQuery(String hql, Object[] parameters) {
55 // TODO Auto-generated method stub
56 Query query=this.sessionFactory.getCurrentSession().createQuery(hql);
57 //给?赋值
58 if(parameters!=null && parameters.length>0){
59 for(int i=0;i<parameters.length;i++){
60 query.setParameter(i, parameters[i]);
61 }
62 }
63
64 return query.uniqueResult();
65 }
66
67 @Override
68 public void addTo(Object obj) {
69 // TODO Auto-generated method stub
70 sessionFactory.getCurrentSession().save(obj);
71
72 }
73
74 }
BaseServiceInter.java
1 package com.blog.service.base;
2
3 import java.io.Serializable;
4 import java.util.List;
5
6 public interface BaseServiceInter {
7 @SuppressWarnings("rawtypes")
8 public Object findById(Class clazz,Serializable id);
9
10 public void delObj(Object obj);
11
12 @SuppressWarnings("rawtypes")
13 public List executeQuery(String hql, Object[] parameters);
14
15 public Object uniqueQuery(String hql, Object[] parameters);
16
17 public void addTo(Object obj);
18
19
20 }
com.blog.service.imp
ArticleServiceImp.java
1 package com.blog.service.imp;
2
3 import java.util.List;
4
5 import com.blog.domain.Article;
6 import com.blog.domain.User;
7 import com.blog.service.base.BaseServiceImp;
8 import com.blog.service.inter.ArticleServiceInter;
9
10 public class ArticleServiceImp extends BaseServiceImp implements
11 ArticleServiceInter {
12
13 /**
14 * 显示指定用户的所有文章
15 */
16 @Override
17 public List<Article> showUserArticles(User user) {
18 // TODO Auto-generated method stub
19 String hql="from Article where user_id=? ";
20 Object []param={user.getId()};
21 return this.executeQuery(hql, param);
22 }
23 /**
24 * 显示所有用户的所有文章
25 */
26 @Override
27 public List<Article> showAllArticles() {
28 // TODO Auto-generated method stub
29 String hql="from Article";
30 return this.executeQuery(hql, null);
31 }
32
33 }
UserServiceImp.java
1 package com.blog.service.imp;
2
3 import org.springframework.transaction.annotation.Transactional;
4
5 import com.blog.domain.User;
6 import com.blog.service.base.BaseServiceImp;
7 import com.blog.service.inter.UserServiceInter;
8
9 @Transactional
10 public class UserServiceImp extends BaseServiceImp implements UserServiceInter {
11
12
13
14 /**
15 * 验证用户
16 * @author frank
17 */
18 @Override
19 public User checkUser(User user) {
20 // TODO Auto-generated method stub
21 String hql="from User where id=? and passwd=?";
22 Object []param={user.getId(),user.getPasswd()};
23 System.out.println("########checkUser########");
24 System.out.println(user.getId()+" "+user.getPasswd());
25 User u= (User) this.uniqueQuery(hql, param);
26 if(u!=null){
27 return u;
28 }
29 else
30 return null;
31 }
32
33 }
com.blog.service.inter
ArticleServiceInter.java
1 package com.blog.service.inter;
2
3 import java.util.List;
4
5 import com.blog.domain.Article;
6 import com.blog.domain.User;
7 import com.blog.service.base.BaseServiceInter;
8
9 public interface ArticleServiceInter extends BaseServiceInter{
10
11 public List<Article> showUserArticles(User user);
12
13 public List<Article> showAllArticles();
14 }
UserServiceInter.java
1 package com.blog.service.inter;
2
3 import com.blog.domain.User;
4 import com.blog.service.base.BaseServiceInter;
5
6 public interface UserServiceInter extends BaseServiceInter {
7 public User checkUser(User user);
8
9 }
com.blog.web.action
GoContentUiAction.java
1 package com.blog.web.action;
2
3 import java.util.List;
4
5
6
7
8
9
10
11
12
13 import org.apache.struts2.ServletActionContext;
14
15 import com.blog.domain.Article;
16 import com.blog.domain.User;
17 import com.blog.service.inter.ArticleServiceInter;
18 import com.opensymphony.xwork2.ActionContext;
19 import com.opensymphony.xwork2.ActionSupport;
20
21 public class GoContentUiAction extends ActionSupport {
22
23 /**
24 *
25 */
26 private static final long serialVersionUID = 1L;
27
28 private ArticleServiceInter articleService;
29
30 public ArticleServiceInter getArticleService() {
31 return articleService;
32 }
33
34 public void setArticleService(ArticleServiceInter articleService) {
35 this.articleService = articleService;
36 }
37
38 public String UserBlog() throws Exception {
39 // TODO Auto-generated method stub
40 User user=(User) ActionContext.getContext().getSession().get("loginUser");
41 List<Article> list=articleService.showUserArticles(user);
42 //截取内容的前200个字符做为摘要
43 for(int i=0;i<list.size();i++){
44 if(list.get(i).getContents().length()>200)
45 list.get(i).setContents(list.get(i).getContents().substring(0, 200));
46 }
47 //把当前登录用户的文章放入request
48 ServletActionContext.getRequest().setAttribute("arts", list);
49 return "userBlog";
50 }
51
52 public String Register() throws Exception {
53 // TODO Auto-generated method stub
54 return "register";
55 }
56
57 public String NewArt() throws Exception {
58 // TODO Auto-generated method stub
59 return "newArt";
60 }
61
62
63 public String ShowArtDet() throws Exception {
64 // TODO Auto-generated method stub
65 Integer id=Integer.parseInt(ServletActionContext.getRequest().getParameter("id"));
66 Article art=(Article) articleService.findById(Article.class, id);
67 ServletActionContext.getRequest().setAttribute("art", art);
68 return "showArtDet";
69 }
70
71 }
LoginAndLogoutAction.java
1 package com.blog.web.action;
2
3 import java.util.List;
4
5 import org.apache.struts2.ServletActionContext;
6
7 import com.blog.domain.Article;
8 import com.blog.domain.User;
9 import com.blog.service.inter.ArticleServiceInter;
10 import com.blog.service.inter.UserServiceInter;
11 import com.opensymphony.xwork2.ActionContext;
12 import com.opensymphony.xwork2.ActionSupport;
13
14 public class LoginAndLogoutAction extends ActionSupport {
15
16 /**
17 *
18 */
19 private static final long serialVersionUID = 1L;
20 private UserServiceInter userService;
21 private ArticleServiceInter articleService;
22 private String userId;
23 private String passwd;
24
25 public ArticleServiceInter getArticleService() {
26 return articleService;
27 }
28
29 public void setArticleService(ArticleServiceInter articleService) {
30 this.articleService = articleService;
31 }
32
33 public UserServiceInter getUserService() {
34 return userService;
35 }
36
37 public void setUserService(UserServiceInter userService) {
38 this.userService = userService;
39 }
40 public String getUserId() {
41 return userId;
42 }
43
44 public void setUserId(String userId) {
45 this.userId = userId;
46 }
47
48 public String getPasswd() {
49 return passwd;
50 }
51
52 public void setPasswd(String passwd) {
53 this.passwd = passwd;
54 }
55
56 public String login() throws Exception {
57 // TODO Auto-generated method stub
58 User user=new User();
59 user.setId(Integer.parseInt(this.getUserId()));
60 user.setPasswd(this.getPasswd());
61 user=userService.checkUser(user);
62 //登录成功
63 if(user!=null){
64 List<Article> list=articleService.showAllArticles();
65 //截取内容的前200个字符做为摘要
66 for(int i=0;i<list.size();i++){
67 if(list.get(i).getContents().length()>200)
68 list.get(i).setContents(list.get(i).getContents().substring(0, 200));
69 }
70 //把所有用户的文章放入request
71 ServletActionContext.getRequest().setAttribute("arts", list);
72 ActionContext.getContext().getSession().put("loginUser", user);
73 }
74 return LOGIN;
75 }
76
77 public String logout() throws Exception {
78 // TODO Auto-generated method stub
79 ActionContext.getContext().getSession().clear();
80 return LOGIN;
81 }
82
83 }
RegisterAction.java
1 package com.blog.web.action;
2
3 import java.io.File;
4 import java.io.FileInputStream;
5 import java.io.FileOutputStream;
6 import java.util.UUID;
7
8 import org.apache.struts2.ServletActionContext;
9
10 import com.blog.domain.User;
11 import com.blog.service.inter.UserServiceInter;
12 import com.opensymphony.xwork2.ActionContext;
13 import com.opensymphony.xwork2.ActionSupport;
14
15 public class RegisterAction extends ActionSupport {
16
17 /**
18 *
19 */
20 private static final long serialVersionUID = 1L;
21
22 private UserServiceInter userService;
23 private String savePath;
24
25 private String userName;
26 private String passwd;
27 private Character sex;
28 private File portrait;
29 //封装上传文件类型及文件名
30 private String portraitContentType;
31 private String portraitFileName;
32
33
34
35
36 public String getPortraitContentType() {
37 return portraitContentType;
38 }
39
40 public void setPortraitContentType(String portraitContentType) {
41 this.portraitContentType = portraitContentType;
42 }
43
44 public String getPortraitFileName() {
45 return portraitFileName;
46 }
47
48 public void setPortraitFileName(String portraitFileName) {
49 this.portraitFileName = portraitFileName;
50 }
51
52 // 接受struts.xml文件配置值的方法
53 public void setSavePath(String value) {
54 this.savePath = value;
55 }
56
57 // 获取上传文件的保存位置
58 private String getSavePath() throws Exception {
59 return ServletActionContext.getServletContext()
60 .getRealPath(savePath);
61 }
62
63
64
65 public String getUserName() {
66 return userName;
67 }
68
69 public void setUserName(String userName) {
70 this.userName = userName;
71 }
72
73 public String getPasswd() {
74 return passwd;
75 }
76
77 public void setPasswd(String passwd) {
78 this.passwd = passwd;
79 }
80
81 public Character getSex() {
82 return sex;
83 }
84
85 public void setSex(Character sex) {
86 this.sex = sex;
87 }
88
89 public File getPortrait() {
90 return portrait;
91 }
92
93 public void setPortrait(File portrait) {
94 this.portrait = portrait;
95 }
96
97 public UserServiceInter getUserService() {
98 return userService;
99 }
100
101 public void setUserService(UserServiceInter userService) {
102 this.userService = userService;
103 }
104
105 @Override
106 public String execute() throws Exception {
107 // TODO Auto-generated method stub
108 // 以服务器的文件保存地址和原文件名建立上传文件输出流
109 //防止重名,采用uuid作为保存文件名,并保留原文件的后缀名
110 String fileName=UUID.randomUUID().toString()+this.getPortraitFileName().substring(this.getPortraitFileName().lastIndexOf(".")) ;
111
112 FileOutputStream fos = new FileOutputStream(
113 getSavePath() + "/" +fileName);
114 FileInputStream fis = new FileInputStream(getPortrait());
115 byte[] buffer = new byte[1024];
116 int len = 0;
117 //写入
118 while ((len = fis.read(buffer)) > 0) {
119 fos.write(buffer, 0, len);
120 }
121 fos.close();
122 fis.close();
123 ActionContext.getContext().getSession().put("uploadFileName", fileName);
124 //保存用户信息到数据库
125 User user=new User(this.getUserName(),this.getPasswd(),this.getSex(),"uploadFiles/"+fileName);
126 userService.addTo(user);
127 //获取刚注册用户的id号
128 String hql="from User where id=(select max(id) from User)";
129 user=(User) userService.uniqueQuery(hql, null);
130 //将登录用户设置为当前用户
131 ActionContext.getContext().getSession().put("loginUser", user);
132
133
134 return SUCCESS;
135 }
136
137
138
139 }
ReleaseAction.java
1 package com.blog.web.action;
2
3 import com.blog.domain.Article;
4 import com.blog.domain.User;
5 import com.blog.service.inter.ArticleServiceInter;
6 import com.opensymphony.xwork2.ActionContext;
7 import com.opensymphony.xwork2.ActionSupport;
8
9 public class ReleaseAction extends ActionSupport {
10
11 /**
12 *
13 */
14 private static final long serialVersionUID = 1L;
15 private ArticleServiceInter articleService;
16 private String title;
17 private Character type;
18 private String contents;
19
20
21 public String getTitle() {
22 return title;
23 }
24
25 public void setTitle(String title) {
26 this.title = title;
27 }
28
29 public Character getType() {
30 return type;
31 }
32
33 public void setType(Character type) {
34 this.type = type;
35 }
36
37 public String getContents() {
38 return contents;
39 }
40
41 public void setContents(String contents) {
42 this.contents = contents;
43 }
44
45 public ArticleServiceInter getArticleService() {
46 return articleService;
47 }
48
49 public void setArticleService(ArticleServiceInter articleService) {
50 this.articleService = articleService;
51 }
52
53 @Override
54 public String execute() throws Exception {
55 // TODO Auto-generated method stub
56 User user=(User) ActionContext.getContext().getSession().get("loginUser");
57 Article art=new Article(title,contents,type,user);
58 articleService.addTo(art);
59 return SUCCESS;
60 }
61
62 }
RegisterAction-validation.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE validators PUBLIC
3 "-//OpenSymphony Group//XWork Validator 1.0.3//EN"
4 "http://www.opensymphony.com/xwork/xwork-validator-1.0.3.dtd">
5 <validators>
6 <validator type="required">
7 <param name="fieldName">userName</param>
8 <message>username must not be null</message>
9 </validator>
10 <validator type="required">
11 <param name="fieldName">passwd</param>
12 <message>password must not be null</message>
13 </validator>
14
15
16 </validators>
applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans
3 xmlns="http://www.springframework.org/schema/beans"
4 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5 xmlns:p="http://www.springframework.org/schema/p"
6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd" xmlns:tx="http://www.springframework.org/schema/tx">
7
8 <!-- 配置action -->
9 <bean id="loginAndLogout" scope="prototype" class="com.blog.web.action.LoginAndLogoutAction">
10 <property name="userService" ref="userServiceImp"></property>
11 <property name="articleService" ref="articleServiceImp"></property>
12 </bean>
13 <bean id="goContentUi" scope="prototype" class="com.blog.web.action.GoContentUiAction">
14 <property name="articleService" ref="articleServiceImp"></property>
15 </bean>
16 <bean id="doRegist" scope="prototype" class="com.blog.web.action.RegisterAction">
17 <property name="userService" ref="userServiceImp"></property>
18 </bean>
19 <bean id="releaseBlog" scope="prototype" class="com.blog.web.action.ReleaseAction">
20 <property name="articleService" ref="articleServiceImp"></property>
21 </bean>
22
23 <!-- 配置service类 -->
24 <bean id="baseServiceImp" class="com.blog.service.base.BaseServiceImp" abstract="true">
25 <property name="sessionFactory" ref="sessionFactory"></property>
26 </bean>
27 <bean id="userServiceImp" class="com.blog.service.imp.UserServiceImp" parent="baseServiceImp"></bean>
28 <bean id="articleServiceImp" class="com.blog.service.imp.ArticleServiceImp" parent="baseServiceImp"></bean>
29
30 <!-- 配置数据源 -->
31 <bean id="dataSource"
32 class="org.apache.commons.dbcp.BasicDataSource">
33 <property name="url" value="jdbc:mysql://127.0.0.1:3306/blog"></property>
34 <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
35 <property name="username" value="root"></property>
36 <property name="password" value="frank1994"></property>
37 </bean>
38 <!-- 配置会话工厂 -->
39 <bean id="sessionFactory"
40 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
41 <property name="dataSource">
42 <ref bean="dataSource" />
43 </property>
44 <property name="hibernateProperties">
45 <props>
46 <prop key="hibernate.dialect">
47 org.hibernate.dialect.MySQLDialect
48 </prop>
49 <prop key="hibernate.show_sql" >true</prop>
50 <prop key="hibernate.format_sql">true</prop>
51 <prop key="hibernate.hbm2ddl.auto">
52 update
53 </prop>
54 </props>
55 </property>
56 <property name="mappingResources">
57 <list>
58 <value>com/blog/domain/User.hbm.xml</value>
59 <value>com/blog/domain/Article.hbm.xml</value>
60 </list>
61 </property>
62 </bean>
63 <!-- 配置事务管理器 -->
64 <bean id="transactionManager"
65 class="org.springframework.orm.hibernate4.HibernateTransactionManager">
66 <property name="sessionFactory" ref="sessionFactory" />
67 </bean>
68 <!-- 开启事务 -->
69 <tx:annotation-driven transaction-manager="transactionManager" /></beans>
struts.xml
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
3 <struts>
4 <package name="lee" extends="struts-default" namespace="/">
5 <action name="*Action" class="loginAndLogout" method="{1}">
6 <!-- 不管登录是否成功,都返回首页面 -->
7 <result name="login">index.jsp</result>
8 </action>
9 <action name="go*Ui" class="goContentUi" method="{1}">
10
11 <result name="userBlog">WEB-INF/page/userBlog.jsp</result>
12 <result name="register">WEB-INF/page/register.jsp</result>
13 <result name="newArt">WEB-INF/page/newArt.jsp</result>
14 <result name="showArtDet">WEB-INF/page/showArtDet.jsp</result>
15 </action>
16 <action name="doRegist" class="doRegist">
17 <param name="savePath">/uploadFiles</param>
18 <result name="success">WEB-INF/page/regSucc.jsp</result>
19 <!-- 指定输入校验失败后返回register.jsp界面 -->
20 <result name="input">/WEB-INF/page/register.jsp</result>
21 <interceptor-ref name="fileUpload">
22 <!-- 配置允许上传的文件类型 -->
23 <param name="allowedTypes">image/bmp,image/png,image/gif,image/jpeg,image/pjpeg</param>
24 <!-- 配置允许上传的文件大小 1M -->
25 <param name="maximumSize">1048576</param>
26 </interceptor-ref>
27 <!-- 配置系统默认拦截器 -->
28 <interceptor-ref name="defaultStack"></interceptor-ref>
29 </action>
30 <action name="releaseBlog" class="releaseBlog">
31 <result name="success" type="redirectAction">goUserBlogUi</result>
32 </action>
33 </package>
34
35 </struts>
WebRoot
index.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme()
6 + "://"
7 + request.getServerName()
8 + ":"
9 + request.getServerPort()
10 + path + "/";
11 %>
12
13 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
14 <html>
15 <head>
16 <base href="<%=basePath%>">
17
18 <title>frank_blog_index</title>
19 <meta http-equiv="pragma" content="no-cache">
20 <meta http-equiv="cache-control" content="no-cache">
21 <meta http-equiv="expires" content="0">
22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23 <meta http-equiv="description" content="This is my page">
24
25 <style type="text/css">
26 body {
27 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
28 background: #4E5869;
29 margin: 0;
30 padding: 0;
31 color: #000;
32 }
33
34 /* ~~ 元素/标签选择器 ~~ */
35 ul,ol,dl {
36 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
37 padding: 0;
38 margin: 0;
39 }
40
41 h1,h2,h3,h4,h5,h6,p {
42 margin-top: 0;
43 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
44 padding-right: 15px;
45 padding-left: 15px;
46 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
47 }
48
49 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
50 border: none;
51 }
52
53 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
54 a:link {
55 color: #414958;
56 text-decoration: underline;
57 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
58 }
59
60 a:visited {
61 color: #4E5869;
62 text-decoration: underline;
63 }
64
65 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
66 text-decoration: none;
67 }
68
69 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
70 .container {
71 width: 80%;
72 max-width: 1260px;
73 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
74 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
75 background: #FFF;
76 margin: 0 auto;
77 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
78 }
79
80 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
81 .header {
82 background: #6F7D94;
83 }
84
85 /* ~~ 这是布局信息。 ~~
86
87 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
88
89 */
90 .content {
91 padding: 10px 0;
92 }
93
94 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
95 .content ul,.content ol {
96 padding: 0 15px 15px 40px;
97 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
98 }
99
100 /* ~~ 脚注 ~~ */
101 .footer {
102 padding: 10px 0;
103 background: #6F7D94;
104 }
105
106 /* ~~ 其它浮动/清除类 ~~ */
107 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
108 float: right;
109 margin-left: 8px;
110 }
111
112 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
113 float: left;
114 margin-right: 8px;
115 }
116
117 .clearfloat {
118 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
119 clear: both;
120 height: 0;
121 font-size: 1px;
122 line-height: 0px;
123 }
124 </style>
125 <!--
126 <link rel="stylesheet" type="text/css" href="styles.css">
127 -->
128 </head>
129
130 <body>
131
132 <div class="container">
133 <div class="header">
134 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
135 name="Insert_logo" width="20%" height="90" id="Insert_logo"
136 style="background: #8090AB; display:block;" /></a>
137 <div>
138
139 <c:if test="${loginUser==null }">
140 <form action="loginAction" method="post">
141 用户id:<input type="text" name="userId" /> 密码<input type="password"
142 name="passwd" /> <input type="submit" value="登录" />
143 </form>
144
145 </c:if>
146 <a href="goRegisterUi">注册</a>
147 <c:if test="${loginUser!=null }">
148 欢迎您${loginUser.userName}<img src="${loginUser.portrait }" width="60px" /><br>
149 <a href="goUserBlogUi">进入我的博客</a> <a
150 href="logoutAction">退出登录</a>
151 </c:if>
152
153
154
155 </div>
156 <!-- end .header -->
157 </div>
158 <div class="content">
159 <h1>最近发布的博文</h1>
160 <c:forEach items="${arts }" var="art">
161 <h2><a href="goShowArtDetUi?id=${art.id }">${art.title }</a></h2><h6>${art.postTime}</h6>
162 <p>${art.contents }</p>
163 <hr />
164 </c:forEach>
165
166
167 <h2> </h2>
168 <!-- end .content -->
169 </div>
170 <div class="footer">
171 <p>脚注</p>
172 <!-- end .footer -->
173 </div>
174 <!-- end .container -->
175 </div>
176 </body>
177 </html>
WEB-INF
web.xml
1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
3 <display-name>frank_blog</display-name>
4 <welcome-file-list>
5 <welcome-file>index.html</welcome-file>
6 <welcome-file>index.htm</welcome-file>
7 <welcome-file>index.jsp</welcome-file>
8 <welcome-file>default.html</welcome-file>
9 <welcome-file>default.htm</welcome-file>
10 <welcome-file>default.jsp</welcome-file>
11 </welcome-file-list>
12 <listener>
13 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
14 </listener>
15 <context-param>
16 <param-name>contextConfigLocation</param-name>
17 <param-value>classpath:applicationContext.xml</param-value>
18 </context-param>
19 <filter>
20 <filter-name>struts2</filter-name>
21 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
22 </filter>
23 <filter-mapping>
24 <filter-name>struts2</filter-name>
25 <url-pattern>/*</url-pattern>
26 </filter-mapping>
27 </web-app>
page
newArt.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags"%>
3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
4 <%
5 String path = request.getContextPath();
6 String basePath = request.getScheme()
7 + "://"
8 + request.getServerName()
9 + ":"
10 + request.getServerPort()
11 + path + "/";
12 %>
13
14 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
15 <html>
16 <head>
17 <base href="<%=basePath%>">
18
19 <title>frank_blog_index</title>
20 <meta http-equiv="pragma" content="no-cache">
21 <meta http-equiv="cache-control" content="no-cache">
22 <meta http-equiv="expires" content="0">
23 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
24 <meta http-equiv="description" content="This is my page">
25
26 <style type="text/css">
27 body {
28 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
29 background: #4E5869;
30 margin: 0;
31 padding: 0;
32 color: #000;
33 }
34
35 /* ~~ 元素/标签选择器 ~~ */
36 ul,ol,dl {
37 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
38 padding: 0;
39 margin: 0;
40 }
41
42 h1,h2,h3,h4,h5,h6,p {
43 margin-top: 0;
44 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
45 padding-right: 15px;
46 padding-left: 15px;
47 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
48 }
49
50 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
51 border: none;
52 }
53
54 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
55 a:link {
56 color: #414958;
57 text-decoration: underline;
58 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
59 }
60
61 a:visited {
62 color: #4E5869;
63 text-decoration: underline;
64 }
65
66 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
67 text-decoration: none;
68 }
69
70 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
71 .container {
72 width: 80%;
73 max-width: 1260px;
74 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
75 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
76 background: #FFF;
77 margin: 0 auto;
78 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
79 }
80
81 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
82 .header {
83 background: #6F7D94;
84 }
85
86 /* ~~ 这是布局信息。 ~~
87
88 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
89
90 */
91 .content {
92 padding: 10px 0;
93 }
94
95 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
96 .content ul,.content ol {
97 padding: 0 15px 15px 40px;
98 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
99 }
100
101 /* ~~ 脚注 ~~ */
102 .footer {
103 padding: 10px 0;
104 background: #6F7D94;
105 }
106
107 /* ~~ 其它浮动/清除类 ~~ */
108 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
109 float: right;
110 margin-left: 8px;
111 }
112
113 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
114 float: left;
115 margin-right: 8px;
116 }
117
118 .clearfloat {
119 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
120 clear: both;
121 height: 0;
122 font-size: 1px;
123 line-height: 0px;
124 }
125 </style>
126 <!--
127 <link rel="stylesheet" type="text/css" href="styles.css">
128 -->
129 </head>
130
131 <body>
132
133 <div class="container">
134 <div class="header">
135 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
136 name="Insert_logo" width="20%" height="90" id="Insert_logo"
137 style="background: #8090AB; display:block;" /></a>
138 <div></div>
139 <!-- end .header -->
140 </div>
141 <div class="content">
142 <s:form action="releaseBlog" method="post">
143 <table>
144 <tr>
145 <td><s:textfield name="title" label="标题" ></s:textfield>
146 </tr>
147 <tr>
148 <td>类型</td>
149 <td><select name="type">
150 <option value="O">原创</option>
151 <option value="R">转载</option>
152 <option value="T">翻译</option>
153 </select></td>
154
155 </tr>
156 <tr>
157 <s:textarea rows="10" cols="25" name="contents" ></s:textarea>
158
159 </tr>
160 <tr>
161 <td><s:submit value="发布" /></td>
162 </tr>
163 </table>
164
165 </s:form>
166
167
168 <h2> </h2>
169 <!-- end .content -->
170 </div>
171 <div class="footer">
172 <p>脚注</p>
173 <!-- end .footer -->
174 </div>
175 <!-- end .container -->
176 </div>
177 </body>
178 </html>
register.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="s" uri="/struts-tags"%>
3 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
4 <%
5 String path = request.getContextPath();
6 String basePath = request.getScheme()
7 + "://"
8 + request.getServerName()
9 + ":"
10 + request.getServerPort()
11 + path + "/";
12 %>
13
14 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
15 <html>
16 <head>
17 <base href="<%=basePath%>">
18
19 <title>frank_blog_index</title>
20 <meta http-equiv="pragma" content="no-cache">
21 <meta http-equiv="cache-control" content="no-cache">
22 <meta http-equiv="expires" content="0">
23 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
24 <meta http-equiv="description" content="This is my page">
25
26 <style type="text/css">
27 body {
28 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
29 background: #4E5869;
30 margin: 0;
31 padding: 0;
32 color: #000;
33 }
34
35 /* ~~ 元素/标签选择器 ~~ */
36 ul,ol,dl {
37 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
38 padding: 0;
39 margin: 0;
40 }
41
42 h1,h2,h3,h4,h5,h6,p {
43 margin-top: 0;
44 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
45 padding-right: 15px;
46 padding-left: 15px;
47 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
48 }
49
50 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
51 border: none;
52 }
53
54 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
55 a:link {
56 color: #414958;
57 text-decoration: underline;
58 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
59 }
60
61 a:visited {
62 color: #4E5869;
63 text-decoration: underline;
64 }
65
66 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
67 text-decoration: none;
68 }
69
70 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
71 .container {
72 width: 80%;
73 max-width: 1260px;
74 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
75 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
76 background: #FFF;
77 margin: 0 auto;
78 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
79 }
80
81 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
82 .header {
83 background: #6F7D94;
84 }
85
86 /* ~~ 这是布局信息。 ~~
87
88 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
89
90 */
91 .content {
92 padding: 10px 0;
93 }
94
95 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
96 .content ul,.content ol {
97 padding: 0 15px 15px 40px;
98 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
99 }
100
101 /* ~~ 脚注 ~~ */
102 .footer {
103 padding: 10px 0;
104 background: #6F7D94;
105 }
106
107 /* ~~ 其它浮动/清除类 ~~ */
108 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
109 float: right;
110 margin-left: 8px;
111 }
112
113 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
114 float: left;
115 margin-right: 8px;
116 }
117
118 .clearfloat {
119 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
120 clear: both;
121 height: 0;
122 font-size: 1px;
123 line-height: 0px;
124 }
125 </style>
126 <!--
127 <link rel="stylesheet" type="text/css" href="styles.css">
128 -->
129 </head>
130
131 <body>
132
133 <div class="container">
134 <div class="header">
135 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
136 name="Insert_logo" width="20%" height="90" id="Insert_logo"
137 style="background: #8090AB; display:block;" /></a>
138 <div>
139
140
141 </div>
142 <!-- end .header -->
143 </div>
144 <div class="content">
145 <s:form action="doRegist" enctype="multipart/form-data" validate="true" method="post">
146 <table>
147 <tr>
148 <td><s:textfield name="userName" label="用户名"></s:textfield>
149 </tr>
150 <tr>
151 <td><s:password name="passwd" label="密码"></s:password>
152
153 </tr>
154 <tr>
155 <td>性别</td>
156 <td><select name="sex"><option value="F">男</option><option value="M">女</select></td>
157 </tr>
158 <tr>
159 <td>
160 <s:file name="portrait" label="头像"></s:file>
161 </td>
162 </tr>
163 <tr>
164 <td>
165 <s:submit value="注册"/>
166 </td>
167 </tr>
168 </table>
169
170 </s:form>
171
172
173 <h2> </h2>
174 <!-- end .content -->
175 </div>
176 <div class="footer">
177 <p>脚注</p>
178 <!-- end .footer -->
179 </div>
180 <!-- end .container -->
181 </div>
182 </body>
183 </html>
regSucc.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme()
6 + "://"
7 + request.getServerName()
8 + ":"
9 + request.getServerPort()
10 + path + "/";
11 %>
12
13 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
14 <html>
15 <head>
16 <base href="<%=basePath%>">
17
18 <title>frank_blog_index</title>
19 <meta http-equiv="pragma" content="no-cache">
20 <meta http-equiv="cache-control" content="no-cache">
21 <meta http-equiv="expires" content="0">
22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23 <meta http-equiv="description" content="This is my page">
24
25 <style type="text/css">
26 body {
27 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
28 background: #4E5869;
29 margin: 0;
30 padding: 0;
31 color: #000;
32 }
33
34 /* ~~ 元素/标签选择器 ~~ */
35 ul,ol,dl {
36 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
37 padding: 0;
38 margin: 0;
39 }
40
41 h1,h2,h3,h4,h5,h6,p {
42 margin-top: 0;
43 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
44 padding-right: 15px;
45 padding-left: 15px;
46 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
47 }
48
49 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
50 border: none;
51 }
52
53 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
54 a:link {
55 color: #414958;
56 text-decoration: underline;
57 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
58 }
59
60 a:visited {
61 color: #4E5869;
62 text-decoration: underline;
63 }
64
65 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
66 text-decoration: none;
67 }
68
69 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
70 .container {
71 width: 80%;
72 max-width: 1260px;
73 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
74 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
75 background: #FFF;
76 margin: 0 auto;
77 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
78 }
79
80 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
81 .header {
82 background: #6F7D94;
83 }
84
85 /* ~~ 这是布局信息。 ~~
86
87 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
88
89 */
90 .content {
91 padding: 10px 0;
92 }
93
94 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
95 .content ul,.content ol {
96 padding: 0 15px 15px 40px;
97 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
98 }
99
100 /* ~~ 脚注 ~~ */
101 .footer {
102 padding: 10px 0;
103 background: #6F7D94;
104 }
105
106 /* ~~ 其它浮动/清除类 ~~ */
107 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
108 float: right;
109 margin-left: 8px;
110 }
111
112 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
113 float: left;
114 margin-right: 8px;
115 }
116
117 .clearfloat {
118 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
119 clear: both;
120 height: 0;
121 font-size: 1px;
122 line-height: 0px;
123 }
124 </style>
125 <!--
126 <link rel="stylesheet" type="text/css" href="styles.css">
127 -->
128 </head>
129
130 <body>
131
132 <div class="container">
133 <div class="header">
134 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
135 name="Insert_logo" width="20%" height="90" id="Insert_logo"
136 style="background: #8090AB; display:block;" /></a>
137 <div>
138 恭喜,注册成功 ${loginUser.userName },您的id号为${loginUser.id }<br/>
139 <img src="${loginUser.portrait }" width="60px" /><br>
140 欢迎您${loginUser.userName} <a href="goRegisterUi">注册</a> <a href="goUserBlogUi">进入我的博客</a> <a
141 href="logoutAction">退出登录</a>
142
143 </div>
144 <!-- end .header -->
145 </div>
146 <div class="content">
147 <h1>最近发布的博文</h1>
148 <c:forEach items="${arts }" var="art">
149 <h2><a href="#">${art.title }</a></h2><h6>${art.postTime}</h6>
150 <p>${art.contents }</p>
151 <hr />
152 </c:forEach>
153
154
155 <h2> </h2>
156 <!-- end .content -->
157 </div>
158 <div class="footer">
159 <p>脚注</p>
160 <!-- end .footer -->
161 </div>
162 <!-- end .container -->
163 </div>
164 </body>
165 </html>
166
167
168
showArtDet.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme()
6 + "://"
7 + request.getServerName()
8 + ":"
9 + request.getServerPort()
10 + path + "/";
11 %>
12
13 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
14 <html>
15 <head>
16 <base href="<%=basePath%>">
17
18 <title>frank_blog_index</title>
19 <meta http-equiv="pragma" content="no-cache">
20 <meta http-equiv="cache-control" content="no-cache">
21 <meta http-equiv="expires" content="0">
22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23 <meta http-equiv="description" content="This is my page">
24
25 <style type="text/css">
26 body {
27 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
28 background: #4E5869;
29 margin: 0;
30 padding: 0;
31 color: #000;
32 }
33
34 /* ~~ 元素/标签选择器 ~~ */
35 ul,ol,dl {
36 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
37 padding: 0;
38 margin: 0;
39 }
40
41 h1,h2,h3,h4,h5,h6,p {
42 margin-top: 0;
43 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
44 padding-right: 15px;
45 padding-left: 15px;
46 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
47 }
48
49 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
50 border: none;
51 }
52
53 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
54 a:link {
55 color: #414958;
56 text-decoration: underline;
57 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
58 }
59
60 a:visited {
61 color: #4E5869;
62 text-decoration: underline;
63 }
64
65 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
66 text-decoration: none;
67 }
68
69 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
70 .container {
71 width: 80%;
72 max-width: 1260px;
73 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
74 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
75 background: #FFF;
76 margin: 0 auto;
77 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
78 }
79
80 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
81 .header {
82 background: #6F7D94;
83 }
84
85 /* ~~ 这是布局信息。 ~~
86
87 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
88
89 */
90 .content {
91 padding: 10px 0;
92 }
93
94 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
95 .content ul,.content ol {
96 padding: 0 15px 15px 40px;
97 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
98 }
99
100 /* ~~ 脚注 ~~ */
101 .footer {
102 padding: 10px 0;
103 background: #6F7D94;
104 }
105
106 /* ~~ 其它浮动/清除类 ~~ */
107 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
108 float: right;
109 margin-left: 8px;
110 }
111
112 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
113 float: left;
114 margin-right: 8px;
115 }
116
117 .clearfloat {
118 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
119 clear: both;
120 height: 0;
121 font-size: 1px;
122 line-height: 0px;
123 }
124 </style>
125 <!--
126 <link rel="stylesheet" type="text/css" href="styles.css">
127 -->
128 </head>
129
130 <body>
131
132 <div class="container">
133 <div class="header">
134 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
135 name="Insert_logo" width="20%" height="90" id="Insert_logo"
136 style="background: #8090AB; display:block;" /></a>
137 <div>
138
139 <c:if test="${loginUser==null }">
140 <form action="loginAction" method="post">
141 用户id:<input type="text" name="userId" /> 密码<input type="password"
142 name="passwd" /> <input type="submit" value="登录" />
143 </form>
144
145 </c:if>
146 <a href="goRegisterUi">注册</a>
147 <c:if test="${loginUser!=null }">
148 欢迎您${loginUser.userName}<img src="${loginUser.portrait }" width="60px" /><br>
149 <a href="goUserBlogUi">进入我的博客</a> <a
150 href="logoutAction">退出登录</a>
151 </c:if>
152
153
154
155 </div>
156 <!-- end .header -->
157 </div>
158 <div class="content">
159 <h1>${art.title }</h1><hr>
160
161 <h6>${art.postTime}</h6>
162 <p>${art.contents }</p>
163
164
165
166 <h2> </h2>
167 <!-- end .content -->
168 </div>
169 <div class="footer">
170 <p>脚注</p>
171 <!-- end .footer -->
172 </div>
173 <!-- end .container -->
174 </div>
175 </body>
176 </html>
userBlog.jsp
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
2 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
3 <%
4 String path = request.getContextPath();
5 String basePath = request.getScheme()
6 + "://"
7 + request.getServerName()
8 + ":"
9 + request.getServerPort()
10 + path + "/";
11 %>
12
13 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
14 <html>
15 <head>
16 <base href="<%=basePath%>">
17
18 <title>frank_blog_index</title>
19 <meta http-equiv="pragma" content="no-cache">
20 <meta http-equiv="cache-control" content="no-cache">
21 <meta http-equiv="expires" content="0">
22 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
23 <meta http-equiv="description" content="This is my page">
24
25 <style type="text/css">
26 body {
27 font: 100%/1.4 Verdana, Arial, Helvetica, sans-serif;
28 background: #4E5869;
29 margin: 0;
30 padding: 0;
31 color: #000;
32 }
33
34 /* ~~ 元素/标签选择器 ~~ */
35 ul,ol,dl {
36 /* 由于浏览器之间的差异,最佳做法是在列表中将填充和边距都设置为零。为了保持一致,您可以在此处指定需要的数值,也可以在列表所包含的列表项(LI、DT 和 DD)中指定需要的数值。请注意,除非编写一个更为具体的选择器,否则您在此处进行的设置将会层叠到 .nav 列表。 */
37 padding: 0;
38 margin: 0;
39 }
40
41 h1,h2,h3,h4,h5,h6,p {
42 margin-top: 0;
43 /* 删除上边距可以解决边距会超出其包含的 div 的问题。剩余的下边距可以使 div 与后面的任何元素保持一定距离。 */
44 padding-right: 15px;
45 padding-left: 15px;
46 /* 向 div 内的元素侧边(而不是 div 自身)添加填充可避免使用任何方框模型数学。此外,也可将具有侧边填充的嵌套 div 用作替代方法。 */
47 }
48
49 a img { /* 此选择器将删除某些浏览器中显示在图像周围的默认蓝色边框(当该图像包含在链接中时) */
50 border: none;
51 }
52
53 /* ~~ 站点链接的样式必须保持此顺序,包括用于创建悬停效果的选择器组在内。 ~~ */
54 a:link {
55 color: #414958;
56 text-decoration: underline;
57 /* 除非将链接设置成极为独特的外观样式,否则最好提供下划线,以便可从视觉上快速识别 */
58 }
59
60 a:visited {
61 color: #4E5869;
62 text-decoration: underline;
63 }
64
65 a:hover,a:active,a:focus { /* 此组选择器将为键盘导航者提供与鼠标使用者相同的悬停体验。 */
66 text-decoration: none;
67 }
68
69 /* ~~ 此容器包含所有其它 div,并依百分比设定其宽度 ~~ */
70 .container {
71 width: 80%;
72 max-width: 1260px;
73 /* 可能需要最大宽度,以防止此布局在大型显示器上过宽。这将使行长度更便于阅读。IE6 不遵循此声明。 */
74 min-width: 780px; /* 可能需要最小宽度,以防止此布局过窄。这将使侧面列中的行长度更便于阅读。IE6 不遵循此声明。 */
75 background: #FFF;
76 margin: 0 auto;
77 /* 侧边的自动值与宽度结合使用,可以将布局居中对齐。如果将 .container 宽度设置为 100%,则不需要此设置。 */
78 }
79
80 /* ~~ 标题未指定宽度。它将扩展到布局的完整宽度。标题包含一个图像占位符,该占位符应替换为您自己的链接徽标 ~~ */
81 .header {
82 background: #6F7D94;
83 }
84
85 /* ~~ 这是布局信息。 ~~
86
87 1) 填充只会放置于 div 的顶部和/或底部。此 div 中的元素侧边会有填充。这样,您可以避免使用任何“方框模型数学”。请注意,如果向 div 自身添加任何侧边填充或边框,这些侧边填充或边框将与您定义的宽度相加,得出 *总计* 宽度。您也可以选择删除 div 中的元素的填充,并在该元素中另外放置一个没有任何宽度但具有设计所需填充的 div。
88
89 */
90 .content {
91 padding: 10px 0;
92 }
93
94 /* ~~ 此分组的选择器为 .content 区域中的列表提供了空间 ~~ */
95 .content ul,.content ol {
96 padding: 0 15px 15px 40px;
97 /* 此填充反映上述标题和段落规则中的右填充。填充放置于下方可用于间隔列表中其它元素,置于左侧可用于创建缩进。您可以根据需要进行调整。 */
98 }
99
100 /* ~~ 脚注 ~~ */
101 .footer {
102 padding: 10px 0;
103 background: #6F7D94;
104 }
105
106 /* ~~ 其它浮动/清除类 ~~ */
107 .fltrt { /* 此类可用于在页面中使元素向右浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
108 float: right;
109 margin-left: 8px;
110 }
111
112 .fltlft { /* 此类可用于在页面中使元素向左浮动。浮动元素必须位于其在页面上的相邻元素之前。 */
113 float: left;
114 margin-right: 8px;
115 }
116
117 .clearfloat {
118 /* 如果从 #container 中删除或移出了 #footer,则可以将此类放置在 <br /> 或空 div 中,作为 #container 内最后一个浮动 div 之后的最终元素 */
119 clear: both;
120 height: 0;
121 font-size: 1px;
122 line-height: 0px;
123 }
124 </style>
125 <!--
126 <link rel="stylesheet" type="text/css" href="styles.css">
127 -->
128 </head>
129
130 <body>
131
132 <div class="container">
133 <div class="header">
134 <a href="#"><img src="img/logo.png" alt="唯一的不变是改变"
135 name="Insert_logo" width="20%" height="90" id="Insert_logo"
136 style="background: #8090AB; display:block;" /></a>
137 <div>
138
139 <c:if test="${loginUser==null }">
140 <form action="loginAction" method="post">
141 用户id:<input type="text" name="userId" /> 密码<input type="password"
142 name="passwd" /> <input type="submit" value="登录" />
143 </form>
144
145 </c:if>
146 欢迎您${loginUser.userName}<img src="${loginUser.portrait }" width="60px" /><br> <a href="#">管理博客</a>
147 <a href="goNewArtUi">新博文</a>
148 <a href="logoutAction">退出登录</a>
149
150 </div>
151 <!-- end .header -->
152 </div>
153 <div class="content">
154 <c:forEach items="${arts }" var="art">
155 <h2><a href="goShowArtDetUi?id=${art.id }">${art.title }</a></h2><h6>${art.postTime}</h6>
156 <p>${art.contents }</p>
157 <hr />
158 </c:forEach>
159
160
161 <h2> </h2>
162 <!-- end .content -->
163 </div>
164 <div class="footer">
165 <p>脚注</p>
166 <!-- end .footer -->
167 </div>
168 <!-- end .container -->
169 </div>
170 </body>
171 </html>